Xamarin android 应用程序在使用 BroadcastReceiver 启动时崩溃但启动了吗?
Xamarin android app crashes on boot with BroadcastReceiver but starts?
我正在尝试在 Xamarin 中启动一个应用程序构建,它在推送到模拟器 运行 android 7.1 (API 25) 时正常运行。但是,当我想在启动时从应用程序启动服务时,应用程序崩溃了,但似乎仍然 运行 并且可以正常工作?由于我无法在重启时调试模拟器,所以我不知道哪里出了问题。
我有以下广播接收器:
[BroadcastReceiver]
[IntentFilter(new[] { Intent.ActionBootCompleted })]
public class BootBroadcastReceiver : BroadcastReceiver
{
public override void OnReceive(Context context, Intent intent)
{
if (intent.Action.Equals(Intent.ActionBootCompleted))
{
Toast.MakeText(context, "Action Boot Completed!", ToastLength.Long).Show();
Intent i = new Intent(context, typeof(BackGroundService));
context.StartService(i);
}
}
}
具有以下权限:
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<application android:label="One.Android" android:icon="@drawable/baseball">
<receiver android:enabled="true"
android:exported="true"
android-permission="android.permission.RECEIVE_BOOT_COMPLETED"
android:name=".BootBroadcastReceiver" >
<intent-filter >
<action android:name="android.intent.action.BOOT_COMPLETED" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
</application>
以及以下服务:
[Service]
public class BackGroundService : Service
{
private Timer _checkServiceTimer;
private Notifications notifi = new Notifications();
public override IBinder OnBind(Intent intent)
{
throw new NotImplementedException();
}
public void MyDebugServiceTester()
{
int i = 0;
_checkServiceTimer = new Timer((o) => {
i++;
notifi.SendLocalNotification("BackGround Booted", "notification number: " + i.ToString(), 0);
//Log.Debug("Refreshing background service", "ammount of times: " + i.ToString());
}, null, 0, 30000);
}
[return: GeneratedEnum]
public override StartCommandResult OnStartCommand(Intent intent, [GeneratedEnum] StartCommandFlags flags, int startId)
{
Log.Debug("BackGroundReceiver", "Started Succesfully");
MyDebugServiceTester();
//return base.OnStartCommand(intent, flags, startId);
return StartCommandResult.NotSticky;
}
public override bool StopService(Intent name)
{
Log.Debug("BackGroundReceiver", "Stopped Succesfully");
return base.StopService(name);
}
有谁知道为什么它会崩溃然后仍然运行?任何提示或解决方案表示赞赏。
您可以在模拟器启动后从命令行运行 adb logcat
。 Android 将缓存错误一段时间,因此任何崩溃报告和堆栈跟踪仍然存在。
调查此输出可以指出根本原因。
将 logcat 日志存储到文件的一种简单方法是此命令 adb logcat -d > logcat.txt
编辑:
您还可以尝试另一件事。当您的调试器已连接时。
adb shell am broadcast -a android.intent.action.BOOT_COMPLETED com.example.app
将 'com.example.app' 更改为您的应用程序名称。这会将 BOOT_COMPLETE 消息发送到您的广播接收器。
我正在尝试在 Xamarin 中启动一个应用程序构建,它在推送到模拟器 运行 android 7.1 (API 25) 时正常运行。但是,当我想在启动时从应用程序启动服务时,应用程序崩溃了,但似乎仍然 运行 并且可以正常工作?由于我无法在重启时调试模拟器,所以我不知道哪里出了问题。
我有以下广播接收器:
[BroadcastReceiver]
[IntentFilter(new[] { Intent.ActionBootCompleted })]
public class BootBroadcastReceiver : BroadcastReceiver
{
public override void OnReceive(Context context, Intent intent)
{
if (intent.Action.Equals(Intent.ActionBootCompleted))
{
Toast.MakeText(context, "Action Boot Completed!", ToastLength.Long).Show();
Intent i = new Intent(context, typeof(BackGroundService));
context.StartService(i);
}
}
}
具有以下权限:
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<application android:label="One.Android" android:icon="@drawable/baseball">
<receiver android:enabled="true"
android:exported="true"
android-permission="android.permission.RECEIVE_BOOT_COMPLETED"
android:name=".BootBroadcastReceiver" >
<intent-filter >
<action android:name="android.intent.action.BOOT_COMPLETED" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
</application>
以及以下服务:
[Service]
public class BackGroundService : Service
{
private Timer _checkServiceTimer;
private Notifications notifi = new Notifications();
public override IBinder OnBind(Intent intent)
{
throw new NotImplementedException();
}
public void MyDebugServiceTester()
{
int i = 0;
_checkServiceTimer = new Timer((o) => {
i++;
notifi.SendLocalNotification("BackGround Booted", "notification number: " + i.ToString(), 0);
//Log.Debug("Refreshing background service", "ammount of times: " + i.ToString());
}, null, 0, 30000);
}
[return: GeneratedEnum]
public override StartCommandResult OnStartCommand(Intent intent, [GeneratedEnum] StartCommandFlags flags, int startId)
{
Log.Debug("BackGroundReceiver", "Started Succesfully");
MyDebugServiceTester();
//return base.OnStartCommand(intent, flags, startId);
return StartCommandResult.NotSticky;
}
public override bool StopService(Intent name)
{
Log.Debug("BackGroundReceiver", "Stopped Succesfully");
return base.StopService(name);
}
有谁知道为什么它会崩溃然后仍然运行?任何提示或解决方案表示赞赏。
您可以在模拟器启动后从命令行运行 adb logcat
。 Android 将缓存错误一段时间,因此任何崩溃报告和堆栈跟踪仍然存在。
调查此输出可以指出根本原因。
将 logcat 日志存储到文件的一种简单方法是此命令 adb logcat -d > logcat.txt
编辑: 您还可以尝试另一件事。当您的调试器已连接时。
adb shell am broadcast -a android.intent.action.BOOT_COMPLETED com.example.app
将 'com.example.app' 更改为您的应用程序名称。这会将 BOOT_COMPLETE 消息发送到您的广播接收器。