Android (Service & PhoneStateListener) - служба перезапускается, но не работает, когда приложение убито диспетчером задач, убийцей или нехваткой памяти - PullRequest
2 голосов
/ 20 марта 2012

Это onStartCommand ()

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    // Notification creation code

    telMgr = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
    telMgr.listen(new PSL(), PhoneStateListener.LISTEN_CALL_STATE);

    return super.onStartCommand(intent, flags, startId);
}

и класс PhoneStateListener (под классом обслуживания)

public class PSL extends PhoneStateListener {
    public void onCallStateChanged(int state, String incomingNum) {
        switch(state) {
        case TelephonyManager.CALL_STATE_IDLE:
        case TelephonyManager.CALL_STATE_OFFHOOK:
            //Work1
            break;
        case TelephonyManager.CALL_STATE_RINGING:
            //Work2
            break;
        }
    }
}

они оба находятся в одном файле .java

У меня есть этот код в одном классе обслуживания.

, когда я звоню startService() из основной деятельности, это работает хорошо. но когда мое приложение уничтожается диспетчером задач, убийцей или автоматически из-за нехватки памяти на устройстве, служба перезапускается, но не работает. когда я захожу в Настройка - Приложение - Выполнение, он показывает процесс 1 и службу 1, до / после kill.but после kill, доля памяти идет 1/10. Я попытался startForeground (), чтобы не быть легко убитым с моим уведомлением - это не сработало. (не показывает никакого уведомления) а также попытался вернуть onStartCommand(): START_STICKY, START_REDELIVER_INTENT - показывает тот же результат, есть ли способ полностью перезапустить или сделать его не убитым?

Ответы [ 3 ]

1 голос
/ 17 мая 2018

После нескольких часов я считаю, что для Android 2.0 или более поздней версии вы можете использовать метод startForeground (), чтобы запустить службу на переднем плане. Документация предоставлена ​​Android

Запущенная служба может использовать API startForeground (int, Notification), чтобы перевести службу в состояние переднего плана, где система считает, что это то, о чем пользователь активно осведомлен, и, таким образом, не является кандидатом на убийство при нехватке памяти. , (По-прежнему теоретически возможно, что служба будет уничтожена под сильным давлением памяти со стороны текущего приложения переднего плана, но на практике это не должно вызывать беспокойства.) Очень редкие шансы Foreground Service убить ОС. Но он работает нормально.

public class ServicePhoneState extends Service {

@Override
public int onStartCommand(Intent intent, int flags, int startId) {

    Intent notificationIntent = new Intent(this, MainActivity.class);
    notificationIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);
    Notification notification = new NotificationCompat.Builder(this)
            .setContentTitle("Music Player")
           .setTicker("Google Music Player")
           .setContentText("My Music")
            .setSmallIcon(R.drawable.ic_bg_icon)
            .setPriority(Notification.PRIORITY_MAX)
            .setContentIntent(pendingIntent)
            .setOngoing(false)
            .build();
    startForeground(10, notification);
    return START_NOT_STICKY;
}
@Override
public void onDestroy() {
    super.onDestroy();
    stopForeground(true);
}
@Override
public IBinder onBind(Intent intent) {
    return null;
}

}

0 голосов
/ 17 мая 2018

После нескольких часов я считаю, что для Android 2.0 или более поздней версии вы можете использовать метод startForeground (), чтобы запустить службу на переднем плане. Документация предоставлена ​​Android

Запущенная служба может использовать API startForeground (int, Notification), чтобы перевести службу в состояние переднего плана, где система считает, что это то, о чем пользователь активно осведомлен, и, таким образом, не является кандидатом на убийство при нехватке памяти. , (По-прежнему теоретически возможно, что служба будет убита из-за чрезмерного давления памяти со стороны текущего приложения переднего плана, но на практике это не должно вызывать беспокойства.) Очень редки шансы, что служба Foreground Service будет убита ОС. Но она работает нормально .

public class ServicePhoneState extends Service {

@Override
public int onStartCommand(Intent intent, int flags, int startId) {

MyPhoneStateListener phoneListener = new 
MyPhoneStateListener(ServicePhoneState.this);
    TelephonyManager telephony = (TelephonyManager) 
    getSystemService(Context.TELEPHONY_SERVICE);
    telephony.listen(phoneListener, PhoneStateListener.LISTEN_CALL_STATE);

Intent notificationIntent = new Intent(this, MainActivity.class);
notificationIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);
Notification notification = new NotificationCompat.Builder(this)
        .setContentTitle("Music Player")
       .setTicker("Google Music Player")
       .setContentText("My Music")
        .setSmallIcon(R.drawable.ic_bg_icon)
        .setPriority(Notification.PRIORITY_MAX)
        .setContentIntent(pendingIntent)
        .setOngoing(false)
        .build();
startForeground(10, notification);
return START_NOT_STICKY;}
  @Override
public void onDestroy() {
super.onDestroy();
stopForeground(true);
}
@Override
public IBinder onBind(Intent intent) {
  return null;}}
0 голосов
/ 21 марта 2012

Я решил это с помощью startForeground ()

Это не сработало, потому что я не использовал Notification.FLAG_FOREGROUND_SERVICE при уведомлении

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...