后台服务在启动设备启动时不起作用

时间:2018-06-15 12:27:15

标签: android-service background-service

我正在尝试创建后台服务,此服务必须在设备启动时启动,所以我有:

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.beche_f.serviceatboot">
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"></uses-permission>


<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">


    <receiver
        android:name=".Startup"
        android:enabled="true"
        android:exported="false">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
        </intent-filter>
        <intent-filter>
            <action android:name="android.intent.action.PACKAGE_REPLACED" />
            <data android:scheme="package" />
        </intent-filter>
        <intent-filter>
            <action android:name="android.intent.action.PACKAGE_ADDED" />
            <data android:scheme="package" />
        </intent-filter>
    </receiver>

    <service android:name=".MyService"></service>

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

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

我的BroadcastReceiver

public class Startup extends BroadcastReceiver {
private static final String TAG_BOOT_BROADCAST_RECEIVER = "TEST";

@Override
public void onReceive(Context context, Intent intent) {

    String action = intent.getAction();

    String message = "BootDeviceReceiver onReceive, action is " + action;

    Toast.makeText(context, message, Toast.LENGTH_LONG).show();

    Log.d(TAG_BOOT_BROADCAST_RECEIVER, action);

    if (Intent.ACTION_BOOT_COMPLETED.equals(action)) {
        startServiceByAlarm(context);
    }
}

/* Create an repeat Alarm that will invoke the background service for each execution time.
 * The interval time can be specified by your self.  */
private void startServiceByAlarm(Context context) {
    // Get alarm manager.
    AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);

    // Create intent to invoke the background service.
    Intent intent = new Intent(context, MyService.class);
    PendingIntent pendingIntent = PendingIntent.getService(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

    long startTime = System.currentTimeMillis();
    long intervalTime = 10 * 1000;

    String message = "Start service use repeat alarm. ";

    Toast.makeText(context, message, Toast.LENGTH_LONG).show();

    Log.d(TAG_BOOT_BROADCAST_RECEIVER, message);

    // Create repeat alarm.
    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, startTime, intervalTime, pendingIntent);
 }
}

为MyService: -

public class MyService extends Service {

private static final String TAG_BOOT_EXECUTE_SERVICE = "BOOT_BROADCAST_SERVICE";

public MyService() {
}

@Override
public IBinder onBind(Intent intent) {
    // TODO: Return the communication channel to the service.
    throw new UnsupportedOperationException("Not yet implemented");
}

@Override
public void onCreate() {
    super.onCreate();
    Log.d(TAG_BOOT_EXECUTE_SERVICE, "RunAfterBootService onCreate() method.");
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    String message = "RunAfterBootService onStartCommand() method.";
    Toast.makeText(getApplicationContext(), message, Toast.LENGTH_LONG).show();
    Log.d(TAG_BOOT_EXECUTE_SERVICE, "RunAfterBootService onStartCommand() method.");
    return super.onStartCommand(intent, flags, startId);
}

@Override
public void onDestroy() {
    super.onDestroy();
 }
}

此代码来自教程,所以它应该工作/ 我把这段代码放到一个新的应用程序中,只有一个活动什么都不做。当我启动这个应用程序时,吐司被正确启动,但当我关闭应用程序时,吐司也会停止。

所以我尝试重启我的设备(在第一次启动应用程序之后),但没有任何反应。

我尝试了另一种使用IntentService和内部循环的方式,每隔20秒发送一次通知,但也不起作用。

我的应用的配置是:         minSdkVersion 15         targetSdkVersion 27         versionCode 1         versionName "1.0"

我在我的个人智能手机上测试这个应用程序:Enspert Rainbow(Android 4.2.2,API 17)

0 个答案:

没有答案