簡體   English   中英

如何讓 C# Xamarin.Android 應用程序在手機啟動時運行?

[英]How can I make C# Xamarin.Android app run at phone start-up?

我一直試圖讓應用程序在手機啟動時運行,並最終在我按下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);                
        }
    }
}

目前,應用程序在收到廣播時重新啟動。 我從adb命令提示符運行它來模擬啟動和手機重啟!

adb -s device-or-emulator-id shell am broadcast -a android.intent.action.BOOT_COMPLETED

這是我的清單文件,不確定它是否正確!

<?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>

需要一步一步來,但不能很好地調試它,當我模擬啟動時手機如何重置真是太奇怪了!

我只是嘗試手動重啟,應用程序嘗試啟動,但unfortunately [myapp] has stopped working然后手機再次重啟。

似乎它試圖打開但立即崩潰,然后重新啟動手機。

從另一個例子中找到了這個,但同樣的事情,只是重新啟動手機..

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);
        }
    }
}

您需要將ActivityFlags.NewTask標志添加到意圖中,因為您要在活動上下文之外啟動活動。

崩潰是因為啟動接收器生成了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);                
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM