Как сделать Сервис, который неустранимым, даже если убит системой? - PullRequest
0 голосов
/ 28 сентября 2018

Я создаю приложение фильтра Blue Light.Итак, я хочу отобразить вид на все приложения.Я сделал это следующей службой,

public class OverlayService extends Service {
    public OverlayService() {}
    View mView;
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
    @Override
    public void onCreate() {
        super.onCreate();

        WindowManager.LayoutParams params;
        if (Build.VERSION.SDK_INT < 26)
            params = new WindowManager.LayoutParams(
                    WindowManager.LayoutParams.MATCH_PARENT,
                    WindowManager.LayoutParams.MATCH_PARENT,
                    WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,
                    WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
                            | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
                            | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
                            | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN, 
                    PixelFormat.TRANSLUCENT);
        else
            params = new WindowManager.LayoutParams(
                    WindowManager.LayoutParams.MATCH_PARENT,
                    WindowManager.LayoutParams.MATCH_PARENT,
                    WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY,
                    WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
                            | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
                            | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
                            | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN,
                    PixelFormat.TRANSLUCENT);

        params.gravity = Gravity.RIGHT | Gravity.TOP;
        params.setTitle("Load Average");
        WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
        mView = ((LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE)).inflate(R.layout.overlay, null);
        wm.addView(mView, params);
    }
    @Override
    public void onDestroy() {
        super.onDestroy();
        if (mView != null) {
            ((WindowManager) getSystemService(WINDOW_SERVICE)).removeView(mView);
        }

    }
}

Работает нормально.Но есть только одна проблема, что

"если я удаляю приложение из последних, оно останавливает службу, а затем автоматически запускает службу через несколько секунд"

Почему служба останавливается и перезапускается?Как этого избежать?

Я попытался переопределить onStartCommand () и использовал START_STICKY .Но бесполезно.

Помоги мне.Заранее спасибо !!!

Ответы [ 3 ]

0 голосов
/ 28 сентября 2018

служба должна быть перезапущена, потому что Android не разрешает это.Вы можете использовать сервис Foreground для улучшения своего приложения.

0 голосов
/ 28 сентября 2018

Первое создание BroadcastReceiver

public class Restarter extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
    Log.i("Broadcast Listened", "Service tried to stop");
    Toast.makeText(context, "Service restarted", Toast.LENGTH_SHORT).show();

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        context.startForegroundService(new Intent(context, YourService.class));
    } else {
        context.startService(new Intent(context, YourService.class));
    }
 } 
}

Добавьте ниже код в вашем сервисе

 @Override
public void onDestroy() {
    super.onDestroy();
    stoptimertask();

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



private Timer timer;
private TimerTask timerTask;
public void startTimer() {
    timer = new Timer();
    timerTask = new TimerTask() {
        public void run() {
            Log.i("Count", "=========  "+ (counter++));
        }
    };
    timer.schedule(timerTask, 1000, 1000); //
}

public void stoptimertask() {
    if (timer != null) {
        timer.cancel();
        timer = null;
    }
}

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

В вашей MainActivity добавьте ниже код

public class MainActivity extends AppCompatActivity {
Intent mServiceIntent;
private YourService mYourService;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mYourService = new YourService();
    mServiceIntent = new Intent(this, mYourService.getClass());
    if (!isMyServiceRunning(mYourService.getClass())) {
        startService(mServiceIntent);
    }
}

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


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

In Manifest.XML

 <receiver
    android:name="Restarter"
    android:enabled="true"
    android:exported="true">
    <intent-filter>
        <action android:name="restartservice" />
    </intent-filter>
</receiver>
0 голосов
/ 28 сентября 2018

Попробуйте добавить этот метод в класс обслуживания

@Override
public void onTaskRemoved(Intent rootIntent){
    super.onTaskRemoved(rootIntent);
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...