2015-04-13 4 views
3

У меня есть Android класс обслуживания код, для которого заключается в следующем:Android сервис получает убит ударяя из приложения

public class LoginService extends Service { 
BroadcastReceiver wifiStateChangeReciever; 

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

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    Log.i("AndroidLearning", "Service onStartCommand Started."); 
    return Service.START_STICKY; 
} 

@Override 
public void onCreate() { 
    super.onCreate(); 
    Log.i("AndroidLearning", "Service Started."); 

    final IntentFilter intentFilter = new IntentFilter(); 
    // intentFilter.addAction("android.net.wifi.WIFI_STATE_CHANGED"); 
    intentFilter.addAction("android.net.wifi.STATE_CHANGE"); 
    wifiStateChangeReciever = new WifiStateChangeReciever(); 
    this.registerReceiver(wifiStateChangeReciever, intentFilter, null, null); 

    Log.i("AndroidLearning", "Reciever Registered."); 
} 

@Override 
public void onDestroy() { 
    Log.i("AndroidLearning", "Service Destroyed."); 
    this.unregisterReceiver(wifiStateChangeReciever); 
} 

@Override 
public void onTaskRemoved(Intent rootIntent) { 
    Log.w("AndroidLearning", "On Task Remove: FLAG_STOP_WITH_TASK - " 
      + ServiceInfo.FLAG_STOP_WITH_TASK); 
    this.unregisterReceiver(wifiStateChangeReciever); 
    Intent restartServiceIntent = new Intent(getApplicationContext(), 
    this.getClass()); restartServiceIntent.setPackage(getPackageName()); 
    PendingIntent restartServicePendingIntent = PendingIntent.getService(
      getApplicationContext(), 1, restartServiceIntent, PendingIntent.FLAG_ONE_SHOT); 
    AlarmManager alarmService = (AlarmManager)this.getSystemService(Context.ALARM_SERVICE); 
    alarmService.setExact(AlarmManager.ELAPSED_REALTIME_WAKEUP, 
      SystemClock.elapsedRealtime() + 1000, restartServicePendingIntent); 
    Log.w("AndroidLearning", "End on task removed"); 
    super.onTaskRemoved(rootIntent); 

} 
} 

Он регистрирует BroadcastReciever. Деятельность, которая начинается этот сервис имеет следующий код:

Intent intent = new Intent(this, LoginService.class); 
startService(intent); 

Однако всякий раз, когда активность будет прокатываются из списка задач (последняя) служба также остановлена. Я переехал на onTaskRemoved, чтобы исправить это, но он все еще не работает, и AlarmManager никогда не запускает pendingIntent. Я попытался использовать оба метода: set и setExact для AlarmManager.

Я также попытался добавить следующие опции в <service> теги

android:stopWithTask="false" 
android:process=":remote" 

, но безрезультатно.

Что я здесь делаю неправильно? Спасибо за помощь.

+0

на Android 5.01, я пробовал отключить мое приложение - и служба была убита (она локальная и в том же процессе), но поскольку я начал ее как липкую услугу, я вижу, что Android возобновляет службу. –

ответ

4

я, наконец, нашел ответ на мою собственную проблему. Похоже, что это была проблема с особым вкусом Android, который я запускал на своем телефоне (Mi UI). Для каждого приложения была отдельная настройка, нужно ли разрешить ее перезапуск или нет.

Screenshot - autostart is the setting that I was looking for

Если этот параметр не настроен никакого количества изменения прав доступа и настроек тревог помог мне.

+0

Спасибо! Мой код был прав, но из-за этой проблемы я потратил 2 дня. Большое спасибо. Можете ли вы рассказать мне, как мы можем получить это разрешение после первого открытия приложения? –

1

Это другой подход от вас, но я недавно установил это, добавив уведомление, когда сервис был запущен

private void showNotification(){ 
    NotificationCompat.Builder builer = new NotificationCompat.Builder(this) 
      .setSmallIcon(R.drawable.logo) 
      .setContentTitle("Service active") 
      .setContentText("Your service keeps running") 
      .setOngoing(true); 
    mNotificationManager.notify(NOTIFICATION_ID, builer.build()); 

} 

Уведомление отображается в onStartCommand и освобождаемый в методе обслуживания OnDestroy.

+0

Это, вероятно, взять больше батареи? Мне не нужен процесс переднего плана. – Sohaib

+0

Я боюсь, что это единственный способ предотвратить закрытие вашего сервиса при выводе вашей активности из списка задач. Alarmmanager сможет перезагрузить вашу службу, но это будет не так, пока ваш будильник не будет запущен. – MrJM

+2

Тогда как работает сервис вроде WhatsApp. Как только я его убью, он перезапускается. Также, что вы подразумеваете под «до срабатывания тревоги»? – Sohaib

0

Вам необходимо запустить сервис на переднем плане, если вы не хотите, чтобы андроид закрыл его.

Notification notification = new Notification(R.drawable.icon, getText(R.string.ticker_text), 
    System.currentTimeMillis()); 
Intent notificationIntent = new Intent(this, ExampleActivity.class); 
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0); 
notification.setLatestEventInfo(this, getText(R.string.notification_title), 
    getText(R.string.notification_message), pendingIntent); 
startForeground(ONGOING_NOTIFICATION_ID, notification); 

http://developer.android.com/guide/components/services.html#Foreground