重新启动设备后重启服务

时间:2018-07-11 13:58:34

标签: java android

我有一个带有服务的程序,如果我重新启动设备,该服务也应重新启动。但这仅在仿真器上有效,如果我在真实设备上尝试该服务完全无法启动。

有人知道我在做什么错吗,或者为什么它只能在模拟器上工作?

BroadcastReviever:

@Override
public void onReceive(Context context, Intent intent) {
    //we double check here for only boot complete event
    if(intent.getAction().equalsIgnoreCase(Intent.ACTION_BOOT_COMPLETED))
    {
        //here we start the service
        Intent serviceIntent = new Intent(context, UploadService.class);
        context.startService(serviceIntent);
    }
}

Manifest.xml:

<uses-permission android:name="android.permission.INTERNET"/>
<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_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.GET_ACCOUNTS_PRIVILEGED"
    tools:ignore="ProtectedPermissions" />
<uses-permission android:name="android.permission.USE_CREDENTIALS" />
<uses-permission android:name="android.permission.READ_OWNER_DATA" />
<uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS"/>
<uses-permission android:name="android.permission.READ_OWNER_DATA" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="Upload FTP"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">

    <receiver
        android:name=".BootCompletedIntentReceiver"
        android:enabled="true"
        android:exported="false">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED"/>
        </intent-filter>
    </receiver>


    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter  >
    </activity>

    <service
        android:name=".UploadService"
        android:isolatedProcess="false"
        android:exported="true"
        android:enabled="true"/>
</application>

仿真器的API为23,真实设备的API为27。 我正在建立最低API级别23和最高API级别27

编辑

现在,我还使用模拟器和android API 27尝试了该程序,并且当我启动程序然后重新启动模拟器时,模拟器不再启动。模拟器启动后,他就开始重新启动,并且循环不断。 (真实设备正常启动,只是不重新启动服务)

3 个答案:

答案 0 :(得分:2)

尝试按以下方式使用LOCKED_BOOT_COMPLETED接收器:

<receiver
android:name=".BootReceiver"
android:directBootAware="true"
android:exported="false">
<intent-filter>
    <action android:name="android.intent.action.LOCKED_BOOT_COMPLETED"/>
    <!-- For pre-N devices -->
    <action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>

别忘了权限

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

看看here以获得更多说明

答案 1 :(得分:0)

现在我自己动手修理,那比我想的容易

public class BootCompletedIntentReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {

    Intent i=new Intent(context, YourClass.class);

    if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.O) {
        context.startForegroundService(i);
    }
    else {
        context.startService(i);
    }

}

答案 2 :(得分:0)

如果我不输入完整的URI,我会有一些奇怪的经历,

例如.BootCompletedIntentReceiver将变成com.company.BootCompletedIntentRecevier

我知道这听起来很愚蠢,但是当我没有在现代SDK上明确说明清单上的内容时,我进行了许多奇怪的回归。