Получение пакета установки и удаления событий - PullRequest
51 голосов
/ 19 сентября 2011

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

br = new BroadcastReceiver() {

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO Auto-generated method stub
        Log.i("Enter", "Enters here");
        Toast.makeText(context, "App Installed!!!!.", Toast.LENGTH_LONG).show();
    }
};
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(Intent.ACTION_PACKAGE_ADDED);
intentFilter.addAction(Intent.ACTION_PACKAGE_INSTALL);
registerReceiver(br, intentFilter);

Это должно сделать тост, когда новое приложение установлено.Но, к сожалению, это не так.Это не входит в метод onReceive.Любая помощь приветствуется.

Ответы [ 3 ]

102 голосов
/ 19 сентября 2011

Я попытался зарегистрировать BroadcastReceiver в файле манифеста или в коде Java.Но оба эти метода не смогли запустить метод onReceive().После поиска этой проблемы я нашел решение для обоих методов из другого потока в SO: Приложение уведомлений Android

В файле манифеста ( этот подход более не применяется, так как API 26 (Android 8), это вызывало проблемы с производительностью в более ранних версиях Android ):

<receiver android:name=".YourReceiver">
    <intent-filter>
        <action android:name="android.intent.action.PACKAGE_INSTALL" />
        <action android:name="android.intent.action.PACKAGE_ADDED" />
        <data android:scheme="package"/>
    </intent-filter>
</receiver>

В коде Java:

IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(Intent.ACTION_PACKAGE_ADDED);
intentFilter.addAction(Intent.ACTION_PACKAGE_INSTALL);
intentFilter.addDataScheme("package");
registerReceiver(br, intentFilter);

Это должно работать для вас.

24 голосов
/ 11 января 2016

Просто чтобы добавить ответ Хуанга выше, вот как получить имя пакета только что установленного приложения:

public class YourReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        String packageName = intent.getData().getEncodedSchemeSpecificPart();
    }
}
21 голосов
/ 29 сентября 2017

Другие ответы указывают на прослушивание ACTION_PACKAGE_ADDED и ACTION_PACKAGE_REPLACED трансляций.Это хорошо для Android 7.1 и ниже.В Android 8.0+ вы не можете зарегистрироваться для этих трансляций в манифесте.

Вместо этого вам необходимо звонить getChangedPackages() на PackageManager периодически, например, через периодический JobSchedulerработа.Это не даст вам результатов в реальном времени, но результаты в реальном времени больше не являются опцией на Android 8.0 +.

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