当我强制关闭我的应用程序时服务停止。如何保持服务?

时间:2017-05-16 13:00:04

标签: android android-service manifest alarm keep-alive

这是我的服务:

public class KeepAliveService  extends Service {
Alarm alarm = new Alarm();
public void onCreate()
{
    Log.i("","KEEPALIVE onCreate");
    super.onCreate();
    Notification notification = new Notification();
    startForeground(1337, notification);
}

@Override
public int onStartCommand(Intent intent, int flags, int startId)
{
    alarm.setAlarm(this);
    Log.i("","KEEPALIVE onCreate start command");
    return START_STICKY;
}

@Override
public void onStart(Intent intent, int startId)
{
    alarm.setAlarm(this);
    Log.i("","KEEPALIVE onStart");
}

@Override
public IBinder onBind(Intent intent)
{
    return null;
}
}

我的清单中有这个:

   <service
        android:name="com.vidyo.vidyomod.KeepAliveService"
        android:exported="true"
        android:process=":KeepAliveService"
        android:enabled="true">
    </service>
    <receiver android:process=":remote" android:name="com.vidyo.vidyomod.utils.Alarm"></receiver>
    <receiver android:name="com.vidyo.vidyomod.utils.AutoStart">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED"></action>
        </intent-filter>
    </receiver>

我这样开始:

    Intent i= new Intent(BaseActivity.this, KeepAliveService.class);
    startService(i);

但是,当我从应用程序列表(电话广场)清除我的应用程序时,我会收到这些日志,之后服务不再起作用了:

05-16 14:52:22.698: I/ActivityManager(1102): Killing 9049:com.vidyo.vidyomod:KeepAliveService/u0a132, isShadow:false (adj 2): stop com.vidyo.vidyomod
05-16 14:52:22.725: D/ActivityManager(1102): SVC-handleAppDiedLocked: app = ProcessRecord{ff18702 9049:com.vidyo.vidyomod:KeepAliveService/u0a132, isShadow:false}, app.pid = 9049
05-16 14:52:22.726: W/ActivityManager(1102): Scheduling restart of crashed service com.vidyo.vidyomod/.KeepAliveService in 1000ms
05-16 14:52:22.726: V/BroadcastQueue(1102): removeReceiverListLocked app = ProcessRecord{ff18702 9049:com.vidyo.vidyomod:KeepAliveService/u0a132, isShadow:false}
05-16 14:52:22.726: V/BroadcastQueue(1102): removeReceiverListLocked app = ProcessRecord{ff18702 9049:com.vidyo.vidyomod:KeepAliveService/u0a132, isShadow:false}
05-16 14:52:22.726: V/BroadcastQueue(1102): removeReceiverListLocked app = ProcessRecord{ff18702 9049:com.vidyo.vidyomod:KeepAliveService/u0a132, isShadow:false}
05-16 14:52:22.857: I/ActivityManager(1102):   Force stopping service ServiceRecord{3c2a0a1 u0 com.vidyo.vidyomod/.KeepAliveService, isShadow:false}
05-16 14:52:22.859: W/ActivityManager(1102): Spurious death for ProcessRecord{ff18702 0:com.vidyo.vidyomod:KeepAliveService/u0a132, isShadow:false}, curProc for 9049: null

编辑:

现在在我的活动中我这样做:

    Intent i= new Intent(VidyoModApplication.this, KeepAliveService.class);
    startService(i);

在我的服务中,在onStardComand上我这样做:

@Override
public int onStartCommand(Intent intent, int flags, int startId)
{
    alarm.setAlarm(this);
    Log.i("","KEEPALIVE onCreate start command");
    Intent notificationIntent = new Intent(Intent.ACTION_MAIN);
    notificationIntent.addCategory(Intent.CATEGORY_HOME);
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);

    Notification notification = new Notification.Builder(this)
            .setContentTitle(getText(R.string.app_name))
            .setContentText("Service is running")
            .setSmallIcon(R.drawable.ic_launcher)
            .setContentIntent(pendingIntent)
            .build();

    startForeground(1337, notification);
    return START_STICKY;
}

但是,当我强制关闭应用程序时,它会停止服务。 找到这个例子后尝试了: http://www.truiton.com/2014/10/android-foreground-service-example/

1 个答案:

答案 0 :(得分:3)

我要在这里出去了。我不知道您使用的具体设备。但是,有许多设备具有“受保护”或“特殊”应用程序的特殊设置页面,允许在后台运行。如果你有这些设备之一,并且你的应用程序不在“受保护”应用程序列表中,并且你的Service被杀死,那么即使你已经将它声明为前景{{1,Android也不会重新启动它并从Service返回START_STICKY

请检查出现此问题的设备是否属于这种情况。

请参阅https://stackoverflow.com/a/41369032/769265https://stackoverflow.com/a/42120277/769265