Неограниченный перезапуск сервиса Android во второй раз - PullRequest
0 голосов
/ 13 января 2019

Я пишу сервис, который отправляет сообщение на удаленный сервер каждый интервал. Я использую Android 4.4 (KitKat). У службы также есть активность, которая позволяет выполнять некоторые минимальные настройки, такие как URL удаленного сервера.

Мне удалось заставить службу работать, начать с загрузки и перезапустить, если ее убили, но у меня возникли некоторые проблемы с последним. Если я открываю приложение в первый раз, все работает хорошо. Уничтожение приложения приводит к намерению вещания, и сервис возрождается (конечно, без активности). Теперь, если я открою приложение во второй раз (после уничтожения и восстановления), в следующий раз, когда я убью приложение, служба не будет перезапущена.

Мой приемник вещания:

public class dynDNSBroadcastReceiver extends BroadcastReceiver {
    private static final String TAG = "dynDNSBroadcastReceiver";
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.d(TAG,"Broadcast received, starting dynDNS service");
        context.startService(new Intent(context, dyndns.class));
    }
}

Мой сервис:

public class dyndns extends Service {

    private static String TAG = "dynDNS service";
    public SharedPreferences myPrefs;
    private Handler mainHandler;
    private Timer timer;

    @Override
    public IBinder onBind(Intent arg0) {
        Log.i(TAG, "Service onBind");
        return null;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        startForeground(1, new Notification());
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.d(TAG, "dynDNS service started");
        mainHandler = new Handler(getApplicationContext().getMainLooper());
        timer = new Timer();
        timer.schedule(new MyTimerTask(), 10000, 10000);
        return START_STICKY;
    }

    @Override
    public void onDestroy() {
        timer.cancel();
        super.onDestroy();
        Log.d(TAG, "dynDNS service destroyed");

        Intent broadcastIntent = new Intent();
        broadcastIntent.setAction("restartService");
        broadcastIntent.setClass(this, dynDNSBroadcastReceiver.class);
        this.sendBroadcast(broadcastIntent);
    }

Соответствующий код из моей деятельности:

private boolean isMyServiceRunning(Class<?> serviceClass) {
        ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
        assert manager != null;
        for (ActivityManager.RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
            if (serviceClass.getName().equals(service.service.getClassName())) {
                Log.d(TAG, serviceClass.getName());
                Log.d (TAG, "Service status: Running");
                return true;
            }
        }
        Log.d (TAG, "Service status: Not running");
        return false;
    }

    @Override
    protected void onDestroy() {
        stopService(mServiceIntent);
        super.onDestroy();
    }

Соответствующий код формы манифеста:

 <service
     android:name="com.dyndns.dyndns"
     android:enabled="true" android:process=":externalProcess">
     <intent-filter>
         <action android:name="com.dyndns.dyndns" />
     </intent-filter>
 </service>

 <receiver android:name="dynDNSBroadcastReceiver"  android:enabled="true" android:exported="true">
     <intent-filter>
         <action android:name="restartService"/>
         <action android:name="android.intent.action.BOOT_COMPLETED"/>
     </intent-filter>
 </receiver>
...