Android: Re-invoke application if task manager kill

亡梦爱人 提交于 2019-12-03 06:57:39

You have to run background service with START_STICKY command. Just extends Service and override onCommand like this :

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

    return START_STICKY;
}

Like this your Service is restart when it's close (by system or anything else)

You just have now check on your service (onCreate for example) if application is running or not and launch it again if not. I suppose PackageManager let you check this or simply put a static boolean is_alive to see if your activity is always running.

Regards Jim

Bug in Android 2.3 with START_STICKY

I needed to keep alive a Service with all my forces. If the service is running anytime you can pop the UI.

onDestroy()

it will re-launch.

Can't be uninstalled the app, because it has a Device Administrator.

It is a kind of parental control, the user knows it is there. Only way to stop is to remove the Device Admin, and uninstall it, but removing Device Admin will lock the phone as Kaspersky how it does.

There are a loot of braodcast receivers, such as boot finshed, user presen, screen on, screen off... , many other, all starting the service, you can do it with UI too. Or in the service check if your activity alive , visible, if not, than pop it.

I hope you will use with good reason the info!

Edit: Restart service code snippet:

    // restart service:
    Context context = getApplicationContext();
    Intent myService = new Intent(context, MyService.class);
    context.startService(myService);

Edit2: add spippet to check if the service is running in ... a load of Broadcasts

   public static  boolean isMyServiceRunning(Context context) {
        ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
        for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
            if (MyService.class.getName().equals(service.service.getClassName())) {
                Log.d("myTag", "true");
                return true;
            }
        }
        Log.d("myTag", "false");
        return false;
    }

Edit3 other service start:

   public static void startTheService(Context context) {
         Intent myService = new Intent(context, MyService.class);
         context.startService(myService);
   }

Dont't forget Android 2.3 bug: do the logic for initialization in

@Override
public void onCreate()

and not in:

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

While look at Google IO official product source code I have found the following

((AlarmManager) context.getSystemService(ALARM_SERVICE))
            .set(
                    AlarmManager.RTC,
                    System.currentTimeMillis() + jitterMillis,
                    PendingIntent.getBroadcast(
                            context,
                            0,
                            new Intent(context, TriggerSyncReceiver.class),
                            PendingIntent.FLAG_CANCEL_CURRENT));

URL for code

You can start a sticky service and register an alarm manager that will check again and again that is your application is alive if not then it will run it.

You can also make a receiver and register it for <action android:name="android.intent.action.BOOT_COMPLETED" /> then you can start your service from your receiver. I think there should be some broadcast message when OS or kills some service/application.

Just to give you a rough idea I have done this and its working 1) register receiver Receiver Code:

@Override public void onReceive(Context context, Intent intent) {

    try {
        this.mContext = context;
        startService(intent.getAction());

        uploadOnWifiConnected(intent);

    } catch (Exception ex) {
        Logger.logException(ex);
        Console.showToastDelegate(mContext, R.string.msg_service_starup_failure, Toast.LENGTH_LONG);
    }
}

private void startService(final String action) {
    if (action.equalsIgnoreCase(ACTION_BOOT)) {

        Util.startServiceSpawnProcessSingelton(mContext, mConnection);

    } else if (action.equalsIgnoreCase(ACTION_SHUTDOWN)) {

    }
}

Service Code:

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

    Logger.logInfo("Service Started onStartCommand");
    return Service.START_STICKY;
}

I prefer doing nothing in onStartCommand because it will get called each time you start service but onCreate is only called 1st time service is started, so I do most of the code in onCreate, that way I don't really care about weather service is already running or not.

according to @RetoMeyer from Google, the solution is to make the app "sticky".

for this, you must establisH START_STICKY in your intent service management.

check this reference from developer android

Yes, Once memory low issue comes android os starts killing application to compensate the required memory. Using services you can achieve this, your service should run parallely with your application but see, some of the cases even your service will be also killed at the same time. After killing if memory is sufficient android os itself try to restart the application not in all the cases. Finally there is no hard and fast rule to re-invoke your application once killed by os in all the cases it depends on os and internal behaviours.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!