Sam*_* Ra 2 c# android xamarin
我一直试图让手机启动时运行一个应用程序,并在我按下时最终运行应用程序KeyCode.CameraButton.我正在使用一个名为BootReceiver,继承自的类BroadcastReceiver.这是我的班级:
namespace ColorPoint.Xamarin.XAndroid
{
[BroadcastReceiver]
[IntentFilter(new[] { Intent.ActionBootCompleted }, Priority = (int)IntentFilterPriority.LowPriority)]
public class BootReceiver : BroadcastReceiver
{
public override void OnReceive(Context context, Intent intent)
{
Intent serviceStart = new Intent(context, typeof(MainActivity));
context.StartActivity(serviceStart);
}
}
}
Run Code Online (Sandbox Code Playgroud)
当广播收到时,应用程序重新启动.我从adb命令提示符运行它来模拟启动和手机重启!
adb -s device-or-emulator-id shell am broadcast -a android.intent.action.BOOT_COMPLETED
Run Code Online (Sandbox Code Playgroud)
这是我的清单文件,不确定它是否正确!
'<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="ColorPoint.Xamarin.XAndroid" android:installLocation="auto" android:versionCode="1" android:versionName="1.0">
<uses-sdk android:minSdkVersion="19" android:targetSdkVersion="19" />
<application android:label="Rexson Barcode Scanner" android:icon="@drawable/icon">
<receiver android:name=".BootReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
</application>
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_INPUT_STATE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
<activity android:name="MainActivity" />
<activity android:name="com.google.zxing.client.android.CaptureActivity" android:exported="false" android:windowSoftInputMode="stateAlwaysHidden">
<intent-filter>
<action android:name="com.phonegap.plugins.barcodescanner.SCAN" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
</manifest>'
Run Code Online (Sandbox Code Playgroud)
需要一步一步地完成这一步但不能很好地调试它,当我模拟启动时,电话重置是多么的错误!
我刚尝试手动重启,应用程序试图启动,但说"不幸的是[myapp]已停止工作"然后再次手机重启
似乎它试图打开但崩溃immediatley,然后重新启动手机
从另一个例子发现这个但同样的事情,只需重新启动手机..
public override void OnReceive(Context context, Intent intent)
{
if (intent.Action == Intent.ActionBootCompleted)
{
bool autoRestart = false;
var sp = context.GetSharedPreferences("preferences", FileCreationMode.Private);
autoRestart = sp.GetBoolean("autoRestart", false);
if (autoRestart)
{
Intent serviceStart = new Intent(context, typeof(MainActivity));
serviceStart.AddFlags(ActivityFlags.NewTask);
context.StartActivity(serviceStart);
}
}
}
Run Code Online (Sandbox Code Playgroud)
您需要将ActivityFlags.NewTask标志添加到intent中,因为您要在活动上下文之外启动活动.
崩溃是因为a Android.Util.AndroidRuntimeException是由启动接收器生成的.
解决方案:
[BroadcastReceiver]
[IntentFilter(new[] { Intent.ActionBootCompleted }, Priority = (int)IntentFilterPriority.LowPriority)]
public class BootReceiver : BroadcastReceiver
{
public override void OnReceive(Context context, Intent intent)
{
Intent serviceStart = new Intent(context, typeof(MainActivity));
serviceStart.AddFlags (ActivityFlags.NewTask);
context.StartActivity(serviceStart);
}
}
Run Code Online (Sandbox Code Playgroud)