Перезапустить службу после остановки

Я разрабатываю приложение, которое используется как приложение-шкафчик, приложение, которое может защитить другие установленные приложения, попросив у пользователя пароль при открытии этих приложений, мое приложение здесь

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

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

Ответ 1

Обновлено:

Restart service after force stop

Ответ: Извините, вы не можете перезапустить его, пока пользователь не запускает приложение вручную.

Предполагая, что ваша служба работает как часть процесса, и если пользователь принудительно останавливает ваш процесс, вам не разрешается выполнять службу снова, пока пользователь вручную не запустит вас. Это особенно действителен от версии 3.0 и выше (проверьте для себя). Это также кажется логичным, если вы думаете, что есть приложение, которое постоянно запускает сервис и каким-то образом раздражает пользователя. Поэтому, когда пользователь заказывает хит (:) force-stops) в приложении, он не должен перезапускать службу, чтобы продолжить прослушивание пользователя.

Например, представьте, что произойдет, если вы сможете создайте приложения, которые просто ели в процессорное время, удерживая блокировку слежения, и вы не можете их убить. Это было бы ужасно и огромной катастрофой безопасности.

Итак, вы не сможете перезапускать службу любыми способами, пока пользователь не запустит одно из ваших действий.

Также вы не можете отключить кнопку AFAIK с принудительной остановкой. Вы должны придерживаться точки зрения, что ничто на устройстве не является вашим, кроме вашего приложения, и (в ограниченной степени) ресурсами, которым вам предоставлен доступ.

По правде говоря, даже приложение gtalk согнется по вашему желанию, если вы захотите принудительно остановить. Он начнется только при использовании Gtalk или других приложений, которые используют службу gtalk, такую ​​как PUSH Gmail (для телефонов, где gtalk не является частью прошивки).

Ссылка Ссылка

Решение:

fooobar.com/questions/24247/...

Ответ 2

Я решил эту проблему, планируя AlarmManager, чтобы снова запустить мой сервис:

    public void onDestroy() {
        AlarmManager alarmMgr = (AlarmManager)this.getSystemService(this.ALARM_SERVICE);
        Intent i = new Intent(this, MyService.class);
        PendingIntent pendingIntent = PendingIntent.getService(this, 0, i, 0);
        alarmMgr.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 10, pendingIntent);
    }

Ответ 3

Создайте свой собственный обработчик исключений и всякий раз, когда приложение аварийно завершает работу службы.

Класс обработчика исключений

*public class MyHandler implements UncaughtExceptionHandler {
    private Context m_context;


    public static void attach(Context context) {
        Thread.setDefaultUncaughtExceptionHandler(
            new MyHandler(context)
        );
    }

    ///////////////////////////////////////////// implementation

    private MyHandler(Context context) {
        m_context=context;
    }

    public void uncaughtException(Thread thread,Throwable exception) {
    /*  StringWriter stackTrace=new StringWriter();
        exception.printStackTrace(new PrintWriter(stackTrace));*/
        System.out.println("ERROR IS "+(exception));


        Intent intent=new Intent("com.sample.service.serviceClass");  
            m_context.startService(intent);

        // from RuntimeInit.crash()
        Process.killProcess(Process.myPid());
        System.exit(10);
    }
}*

Присоединитесь к своей деятельности

public class MyActivity extends Activity{
public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.grid_layout);
        MyHandler.attach(this);
}
}