Кто звонит / запускает / останавливает мое приложение для Android? - PullRequest
1 голос
/ 19 декабря 2011

Есть ли способ узнать, кто является вызывающим приложением?

Это несколько вариантов использования:

  • У меня есть приложение и виджет. Приложение не запущено. После добавления / удаления виджета система вызывает приложение для запуска (вызывается Application.onCreate() и т. Д.). Поэтому мне нужно знать, что это не пользователь, который нажимает значок, чтобы запустить приложение, но это система должна обновить виджет.
  • Когда у меня заканчивается память, система убивает приложение, а затем восстанавливает его снова, когда памяти достаточно. Вопрос такой же, как и выше.
  • Больше похожих случаев ...

Единственный случай, которым я могу управлять - это BootUpReceiver, который расширен с BroadcastReceiver. Только в этом случае я уверен, что приложение запускается функцией «запуск при запуске».

Мне нужно знать наверняка - кто (какая служба, получатель, намерение и т. Д.) Почему именно вызывает мое приложение.

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

Ответы [ 2 ]

2 голосов
/ 16 октября 2012

Как уже упоминалось @CommonsWare:

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

Но на самом делеВы можете получить общее представление о том, почему ваше приложение было вызвано с помощью запроса сообщения MainLooper.Для этого вы можете использовать следующий код:

public static void dumpMainLooper(Context context) {
    Looper looper = context.getMainLooper();
    try {
        looper.dump(new Printer() {
            @Override
            public void println(String s) {
                Log.d(LOG_TAG, "- " + s);
            }
        }, "AppMainLooperDump");
    } catch (Throwable th) {
        Log.d(LOG_TAG, "App Main Looper error", th);
    }
}

Вы не должны использовать этот код для любой «логики» в вашем приложении, но вы можете использовать его для отладки и / иливедение журнала, чтобы получить общее представление о Intent s, отправленных системой вашему приложению для его запуска.Вы должны вызвать этот метод как можно раньше, и в журналах вы увидите что-то вроде этого:

Looper{41ff0388}
mRun=true
mThread=Thread[main,5,main]
mQueue=android.os.MessageQueue@41ff03a8
  Message 0: { what=100 when=-438ms obj=ActivityRecord{41ff43e0 token=android.os.BinderProxy@41ff3b78 {com.your.package/com.your.package.MainActivity}} }
  Message 1: { what=132 when=+9s911ms }
(Total messages: 2)

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

1 голос
/ 19 декабря 2011

Мне нужно знать наверняка - кто (какая служба, почему и т. Д.) Вызывает приложение.

Почему?У вас есть подробное объяснение сценариев, но нет обоснования.

Есть ли способ узнать источник вызывающего абонента, или идентификатор вызывающего абонента, или любую информацию о службе или любом другом, кто вызывает мое приложение для запуска?

Не совсем.Основное исключение - если у вас есть служба, связанная с клиентом, и клиент вызывает метод в вашем Binder, ваш Binder может узнать UID процесса, который его вызвал.Кроме того, в некоторых местах вы можете узнать, обладает ли вызывающий абонент определенным разрешением.

Но лучший ответ для вас - изменить дизайн приложения таким образом, чтобы вам было все равно, почему выполняется код.

...