应用程序被杀后服务停止

时间:2017-12-27 23:24:29

标签: android android-studio android-service

START_STICKY不能在我的设备上工作每当我杀了我的应用程序然后服务不再启动,我的设备名称是Redmi Note 3 Pro,但每当我在Android模拟器中运行相同的应用程序时,它会在我杀死时重新启动服务应用程序和服务不会停止,直到我通过stopService()方法停止它

请帮帮我

解决了问题

  

完成此事:

设置>权限>自动启动 然后打开我的应用程序的开关,然后完成!

我在此链接中找到了解决方案:Solution Link

3 个答案:

答案 0 :(得分:5)

在某些设备上(特别是小米,华为,联想),您需要将应用添加到“受保护的应用”或“允许在后台运行的应用”列表中。如果您的应用不在列表中,即使您已从Service返回START_STICKY,Android也不会自动重新启动onStartCommand()。这是一个“节省电池的功能”,不幸的是,它给开发人员带来了很多问题!

在电源管理,安全或应用下的Android设置中查看这些设置。

另见:

请解释“杀死我的应用”的含义。如果您强行关闭应用,则Android不会重新启动Service。这是故意的,如果强行关闭应用程序,它也不会在模拟器上重新启动。

答案 1 :(得分:2)

您需要在清单中的服务属性内添加“ android:process =:any_name”。

例如,

      <service android:name=".MyService"
        android:process=":MyService"
        android:enabled="true"/>

下面是我的Service类的代码。

public class MyService extends Service {
@Nullable
@Override
public IBinder onBind(Intent intent) {
    return null;
}


@Override
public void onCreate() {
    super.onCreate();
    Log.e("onCreate", "onCreate");
    Toast.makeText(AppController.getInstance(),"Created",Toast.LENGTH_SHORT).show();
}

@Override
public void onDestroy() {
    super.onDestroy();
    Log.e("servicedestroy", "servicedestroy");
    Toast.makeText(AppController.getInstance(),"service destroy",Toast.LENGTH_SHORT).show();
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    Timer t = new Timer();
    t.scheduleAtFixedRate(new TimerTask() {
                              @Override
                              public void run() {

                                  new Handler(Looper.getMainLooper()).post(new Runnable() {
                                      @Override
                                      public void run() {
                                          Toast.makeText(AppController.getInstance(),"Running",Toast.LENGTH_SHORT).show();
                                      }
                                  });


                              }

                          },
            0,
            5000);

    return START_STICKY;
}

@Override
public void onTaskRemoved(Intent rootIntent) {
    Intent restartServiceIntent = new Intent(getApplicationContext(), this.getClass());
    restartServiceIntent.setPackage(getPackageName());

    PendingIntent restartServicePendingIntent = PendingIntent.getService(getApplicationContext(), 1, restartServiceIntent, PendingIntent.FLAG_ONE_SHOT);
    AlarmManager alarmService = (AlarmManager) getApplicationContext().getSystemService(Context.ALARM_SERVICE);
    alarmService.set(
            AlarmManager.ELAPSED_REALTIME,
            SystemClock.elapsedRealtime() + 1000,
            restartServicePendingIntent);

    super.onTaskRemoved(rootIntent);
}

}

答案 2 :(得分:-1)

代码可能会帮助您HourlyServiceonStartCommand方法返回START_STICKY

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    return START_STICKY;
}

内部活动

 private HourlyService mHourlyService;
private ServiceConnection mServiceConnection = new ServiceConnection() {
    @Override
    public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
        // We've bound to LocalService, cast the IBinder and get LocalService instance
        LocalBinder binder = (LocalBinder) iBinder;
        mHourlyService = binder.getService();
        mBound = true;
    }

    @Override
    public void onServiceDisconnected(ComponentName componentName) {
        mBound = false;
    }
};

@Override
protected void onStart() {
    super.onStart();
    // Bind to LocalService
    Intent intent = new Intent(this, HourlyService.class);
    bindService(intent, mServiceConnection, Context.BIND_AUTO_CREATE);
}

@Override
protected void onStop() {
    super.onStop();
    unbindService(mServiceConnection);
    mBound = false;
}