Создание службы Android, которую нельзя убить - PullRequest
2 голосов
/ 10 сентября 2010

Я пытаюсь написать приложение, которое не может быть убито пользователем или другим приложением.Я понимаю, что это идет вразрез с тем, что Android разработал для своей платформы, это скорее подтверждение концепции.План два состоит из двух приложений, app1 и app2.Когда приложение app1 запускается, оно запускает app2, а затем связывается с app2, когда app2 запускается, оно проверяет, запущено ли app1, если нет, затем запускает его и связывается с app1.Точка привязки app1 к app2 и app2 привязки к app1 заключается в том, что когда один из них будет убит, будет вызван метод, что привязка была отключена, а затем приложение может быть перезапущено.В настоящее время у меня есть приложения, запускающие друг друга, когда они запускаются, но я не могу заставить их перезапускаться, когда принудительно закрываю одно из них.

Для службы App1 у меня и app2 очень похожи:

    @Override
public void onCreate()
{
    this.setForeground(true);
    this.startService((new Intent()
            .setComponent(new ComponentName("com.app2",
                    "com.app2.App2Service"))));
    this.bindService((new Intent()
            .setComponent(new ComponentName("com.app2",
                    "com.app2.App2Service"))), mConnection,
            BIND_DEBUG_UNBIND);

А для моего класса, реализующего ServiceConnection, у меня есть:

    @Override
public void onServiceDisconnected(ComponentName name)
{
    Log.d(TAG, "onServiceDisconnected:" + name.getClassName());
    mContext.startService((new Intent()
            .setComponent(new ComponentName("com.app2",
                    "com.app2.App2Service"))));
}

Я думаю, что проблема в том, что яИмеется в том, что onServiceDisconnected никогда не вызывается, когда app1 или app2 убиты.Я думаю, что это может быть связано с тем, что я неправильно привязываюсь к сервису.

W/JavaBinder(  884): ibinderForJavaObject: 0x436274a0 is not a Binder object
W/JavaBinder(  891): ibinderForJavaObject: 0x43621d30 is not a Binder object

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

Ответы [ 4 ]

2 голосов
/ 10 сентября 2010

Сначала нужно указать «нельзя быть убитым».Пользователем?На платформе?Убийцей задач?

Я сомневаюсь, что вы можете сделать что-то с двумя .apks, чтобы в целом снизить вероятность вашего убийства, кроме того, чтобы скрыть от пользователя то, что вы делаете.(И если ваша цель состоит в том, чтобы скрыть пользователя ... это опасно приближается к вредоносному ПО.)

Правильный способ сказать платформе, чтобы она не убивала ваше приложение, - это Service.startForeground ().Это говорит о том, что «пользователь знает о моем сервисе, поэтому было бы неплохо продолжать его работу».В дополнение к этому, публикуется уведомление, гарантирующее, что пользователь знает о нем и знает, как от него избавиться.

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

1 голос
/ 26 марта 2011

просто попробуйте ответить ..

Служба не может быть убита. в методе onDestroy снова запустите службу .. ^^

0 голосов
/ 29 марта 2011

В официальной документации я прочитал, что метод "onServiceDisconnected ()" вызывается только тогда, когда вы пытаетесь привязать сервис, а по какой-то причине вы не можете. Так что ваше соединение закрывается. Это не значит, что этот метод перехватывает привязку со стороны клиента. Вы должны следовать за @Adekdik и использовать метод "onDestroy ()" вместо этого.

0 голосов
/ 10 сентября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...