skip to Main Content

I made a lock screen app. I want to restart my service when the OS kills the service in Xiaomi Redmi Note 10 Pro (MIUI 12). When the service is killed, onDestroy is not call.

public class LockScreenService extends Service {
    SharedPreferences prefs;
    private  BroadcastReceiver screenStateReceiver;
    public static boolean isScreenReceiverRegistered=false;
    public IBinder onBind(Intent paramIntent) {
        return null;
    }
    public void onCreate() {
        super.onCreate();

        prefs = getSharedPreferences("SettingPreference", Context.MODE_PRIVATE);
        IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);
        filter.addAction(Intent.ACTION_SCREEN_OFF);
        filter.setPriority(999);
        screenStateReceiver = new ScreenStateReceiver();
        registerReceiver(screenStateReceiver, filter);
        isScreenReceiverRegistered = true;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
            String channelId = createNotificationChannel(notificationManager);
            NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this, channelId);
            Notification notification = notificationBuilder.setOngoing(true)
                    .setSmallIcon(R.drawable.icon_notification)
                    .setPriority(NotificationCompat.PRIORITY_MIN)
                    .setCategory(NotificationCompat.CATEGORY_SERVICE)
                    .build();

            startForeground(127, notification);
        }
    }

    @RequiresApi(Build.VERSION_CODES.O)
    private String createNotificationChannel(NotificationManager notificationManager){
        String channelId = "my_service_channelid";
        String channelName = "Lock Screen Running";
        NotificationChannel channel = new NotificationChannel(channelId, channelName, NotificationManager.IMPORTANCE_HIGH);
        // omitted the LED color
        channel.setImportance(NotificationManager.IMPORTANCE_NONE);
        channel.setLockscreenVisibility(Notification.VISIBILITY_PRIVATE);
        notificationManager.createNotificationChannel(channel);
        return channelId;
    }

    @Override
    public int onStartCommand(final Intent intent, final int flags,
                              final int startId) {
        return START_STICKY;
    }

and on onDestroy() function I restart my service.

Manifests

<service android:name=".LockScreenService"
        android:process=":ServiceProcess"
        android:enabled="true"
        android:exported="false"/>

2

Answers


  1. try this, if you want to get it in onResume()

        @Override
            protected void onResume() {
                super.onResume();
        
                Log.d(TAG, "onResume: GamePreferences.getPid()-------->   " + GamePreferences.getPid());
                Log.d(TAG, "onResume: android.os.Process.myPid()-------->   " + android.os.Process.myPid());
                if (GamePreferences.getPid() != 0) {
                    if (GamePreferences.getPid() != android.os.Process.myPid()) {
                        Log.d(TAG, "GamePreferences.getPid() != android.os.Process.myPid(): -------->   " + android.os.Process.myPid());
        
                        //restart your service in foreground
                        return;
                    }
             }
       }
    
    Login or Signup to reply.
  2. According to the documentation, there is no guarantee onDestroy will be called. I could not find an explicit mention to what happens when the process is killed, but it seems that you are more likely to be called onStop. So you can try to start your service with an intent from onStop.

    Also, there are documented ways to prevent your process to be elected, such as: having a related Activity running or having ongoing callbacks in BroadcastReceiver or Service.

    Note well that your process might get killed by the user, and refusing to comply to the user’s desire to kill is invasive. Therefore the best solution should be designed around the actual reason why a user would want your process to stay alive.

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search