我的AndroidManifest
,Broadcastreceiver
和服务类如下所示。
DetectBootUp.cs:
[BroadcastReceiver]
[IntentFilter(new[] { Intent.ActionBootCompleted })]
public class DetectBootUp : BroadcastReceiver
{
public override void OnReceive(Context context, Intent intent)
{
Intent bootUp = new Intent(context, typeof(AndroidService));
context.StartService(bootUp);
}
}
AndroidService.cs
[Service]
public class AndroidService : Service
{
public override void OnCreate()
{
Toast.MakeText(this, "Service Created", ToastLength.Long).Show();
Log.Debug("BroadCastReceiverBoot", "OnCreate");
}
public override IBinder OnBind(Intent intent)
{
return null;
}
public override void OnDestroy()
{
Toast.MakeText(this, "Service Destroyed", ToastLength.Long).Show();
Log.Debug("BroadCastReceiverBoot", "onDestroy");
ApplicationContext.StartService(new Intent(ApplicationContext, typeof(AndroidService)));
}
[return: GeneratedEnum]
public override StartCommandResult OnStartCommand(Intent intent, [GeneratedEnum] StartCommandFlags flags, int startId)
{
Toast.MakeText(this, "Service Started", ToastLength.Long).Show();
Log.Debug("BroadCastReceiverBoot", "OnStart");
return StartCommandResult.Sticky;
}
}
的AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<uses-sdk android:minSdkVersion="15" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<application android:label="NotificationExample">
<receiver
android:name=".DetectBootUp"
android:enabled="true"
android:permission="android.permission.RECEIVE_BOOT_COMPLETED">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</receiver>
<service android:name=".AndroidService"
android:enabled="true"
android:exported="false">
</service>
</application>
</manifest>
MainActivity.cs
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsApplicationActivity
{
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
global::Xamarin.Forms.Forms.Init(this, bundle);
LoadApplication(new App());
StartService(new Android.Content.Intent(Application.Context, typeof(AndroidService)));
}
}
重启设备时,我希望执行服务类中的进程。但它给出了一个错误。为什么? 当我运行应用程序时它工作正常,但我希望它在设备重启时自动执行。可能接收器上有错误但我无法找到位置。
答案 0 :(得分:0)
在Android 3.1之后“系统将FLAG_EXCLUDE_STOPPED_PACKAGES
添加到所有广播意图。”这意味着在3.1之后,所有应用程序都会在启动时停止。为什么?出于安全考虑。
有标准关闭FLAG_EXCLUDE_STOPPED_PACKAGES
。
(1)您的应用需要手机存储,而不是SD卡,否则标志设置。在安装外部存储之前发送BOOT_COMPLETE
。如果应用程序安装到外部存储,它将不会收到BOOT_COMPLETE
广播消息。
(2)如果用户从设置或“无响应的应用程序”按钮按下“强制关闭”,则设置该标志。
(3)如果应用程序从未运行过,则设置标志(从不相对于当前引导状态; O)从不意味着在此引导中或者在上次引导状态中使标志无效。)
如果您遵守规则,您的Receiver将在启动时运行(标记未设置)。