【问题标题】:Continue service when app is killed应用程序被杀死时继续服务
【发布时间】:2014-07-29 14:36:51
【问题描述】:

我有一个带有两个按钮(ON 和 OFF)的活动:当我单击 ON 按钮时,服务启动。当我单击关闭按钮时,服务停止。现在,除了我从“最近的应用程序”中终止应用程序之外,我的服务没有问题,因为在这种情况下服务会重新启动。我不希望它重新启动,但我希望它继续工作。该服务是 START_STICKY。
这是我的“服务”代码:

@Override
public void onCreate() {
    // TODO Auto-generated method stub
    myServiceReceiver = new MyServiceReceiver();
    mNM = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);

    // Display a notification about us starting.  We put an icon in the status bar.
    showNotification();
}

public class LocalBinder extends Binder {
    SensorService getService() {
        return SensorService.this;
    }
}

@Override
public IBinder onBind(Intent arg0) {
    // TODO Auto-generated method stub
    return mBinder;
}

// This is the object that receives interactions from clients.  See
// RemoteService for a more complete example.
private final IBinder mBinder = new LocalBinder();

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    // TODO Auto-generated method stub
    if (!running){
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction(MY_ACTION_FROMACTIVITY);
        registerReceiver(myServiceReceiver, intentFilter);
        running = true;

        sensorManager=(SensorManager) getSystemService(Context.SENSOR_SERVICE);
        sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_LINEAR_ACCELERATION),   SensorManager.SENSOR_DELAY_NORMAL);
    }
    //return super.onStartCommand(intent, flags, startId);
    return START_STICKY;
}

@Override
public void onDestroy() {
    Log.v(TAG,"destroy");
    // TODO Auto-generated method stub
    sensorManager.unregisterListener(this);
    mNM.cancel(NOTIFICATION);
    this.unregisterReceiver(myServiceReceiver);
    super.onDestroy();
}


private void showNotification() {
    CharSequence text = getText(R.string.activity);
    Notification notification = new Notification(R.drawable.lifestyle, text, System.currentTimeMillis());

    SharedPreferences flagNot = getSharedPreferences("flagNotification", 0);
    final SharedPreferences.Editor editor = flagNot.edit();
    editor.putBoolean("flagNotification",true);
    editor.commit();

    Intent notificationIntent = new Intent(this, ActivityTab.class);
    // The PendingIntent to launch our activity if the user selects this notification
    PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);
    notification.setLatestEventInfo(this, getText(R.string.app_name),text, contentIntent);
    notification.flags |= Notification.FLAG_NO_CLEAR;
    // Send the notification.
    mNM.notify(NOTIFICATION, notification);
}


public void onAccuracyChanged(Sensor sensor,int accuracy){

}

public void onSensorChanged(SensorEvent event){
    ......
}

public class MyServiceReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context arg0, Intent arg1) {
        // TODO Auto-generated method stub
        int hostCmd = arg1.getIntExtra(CMD, 0);
        if(hostCmd == CMD_STOP){
            running = false;

            stopSelf();
        }
    }
}       

}

你能帮帮我吗?
非常感谢。

【问题讨论】:

  • 我们是开发人员。我们不能干涉操作系统的运行。当您的应用程序终止时,操作系统必须自动停止所有后台服务,以便释放内存。您可以继续服务,直到应用程序强制停止。
  • 我知道。为了更好地解释我想要什么,你以谷歌时钟的倒计时为例。如果它启动并且我从最近的应用程序中终止该应用程序,则倒计时不会从头重新开始,而是继续。
  • 这有两个不同的层次;一种是防止服务被杀死,另一种完全不同的是允许替换服务以对用户透明的方式从被杀死的服务停止的地方接起。

标签: android service kill


【解决方案1】:

在您的服务中实现startForeground 并向其发送持久通知。

private void startForeground() {
    int ID = 1234;
    Intent intent = new Intent(this, MainActivity.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
    PendingIntent pendIntent = PendingIntent.getActivity(this, 0, intent, 0);

    Notification.Builder builder = new Notification.Builder(getBaseContext());
    builder.setContentIntent(pendIntent);
    builder.setSmallIcon(R.drawable.ic_launcher);
    builder.setTicker("CUSTOM MESSAGE");
    builder.setWhen(System.currentTimeMillis());
    builder.setAutoCancel(false);
    builder.setContentTitle("Test Service");
    builder.setContentText("CUSTOM MESSAGE");

    Notification notification = builder.build();

    startForeground(ID, notification);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-18
    • 1970-01-01
    • 2018-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多