安装应用程序时呼叫接收器

时间:2018-07-30 11:08:41

标签: android

在安装应用程序时我需要设置一个警报。当我将线程放入时它正在工作 我的应用程序类。但是只有在打开应用程序后,它才能起作用。

有没有什么方法可以监听应用安装?

2 个答案:

答案 0 :(得分:2)

您无法实现。问题在于,在设备上首次安装后,程序包管理器默认使所有接收器都启用=“ false”。因此,安装后无法触发它。应用程序的第一顿午餐后,所有接收者都将采用您在AndroidManifest中编写的所有状态

答案 1 :(得分:-2)

更新3

  • Intent.ACTION_PACKAGE_ADDED是隐式广播,并且 Android 8.0或更高版本无法再为隐式广播注册广播接收器

Implicit Broadcast Exceptions

  

面向Android 8.0或更高版本的应用无法再注册   清单中隐式广播的广播接收器。一个   隐式广播是不针对该应用的广播   特别。例如,ACTION_PACKAGE_REPLACED是一个隐式   广播,因为它已发送给所有注册的听众,让他们   知道设备上的某些包装已被替换。

     

但是,   ACTION_MY_PACKAGE_REPLACED不是隐式广播,因为它是   仅发送到已替换其软件包的应用程序,无论有多少   其他应用已为该广播注册了侦听器。

  

为帮助了解发生了什么,我需要澄清一下,此更改的目的与电池使用没有直接关系,而是要解决平台在内存不足的设备中长期存在的问题会进入不良的颠簸状态。这些状态通常是由于广播引起的:某些广播或广播的发送相对频繁,许多应用程序正在通过清单进行监听(因此需要启动以接收它),但是没有足够的RAM来保留所有状态这些应用的处理过程都缓存在缓存中,因此每次发送广播时,系统最终都会不断地在各个进程中进行颠簸。

     

这是一个问题,无论设备当前是否已接通电源。实际上,这在Android TV设备(总是插上电源)上可能经常成为问题,因为它们的RAM往往很紧!

黑客

    可以使用
  • ACTION_PACKAGE_ADDED broadcast作为应用程序安装列表,通过CommonsWare检查hack
  

如果您正在接收系统发送的隐式广播(例如ACTION_PACKAGE_ADDED),请保持targetSdkVersion at 25或更低,直到我们找到更好的解决方法(希望)不涉及轮询。

更新0

Manifest.xml

  • 应用安装/添加。

    <intent-filter>
      <action android:name="android.intent.action.PACKAGE_ADDED" />
      <data android:scheme="package" />
    </intent-filter>
    
  • 应用更新

    <intent-filter>
     <action android:name="android.intent.action.MY_PACKAGE_REPLACED" />
     <data android:scheme="package" />
    </intent-filter>
    

广播接收器

    @Override
    public void onReceive(Context context, Intent intent) {
        Uri data = intent.getData();
        if (data.toString().equals("package:" + "com.target.package") {
            // Do your stuff
        }
    }

更新1

  • 使用BaseActivity

    public abstract class BaseActivity extends AppCompatActivity{
    
    final BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent == null || intent.getAction() == null)
                return;
            switch (intent.getAction()){
                case Intent.ACTION_PACKAGE_ADDED:
                    // Do your stuff.
                    break;
            }
        }
    };
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        registerReceiver(broadcastReceiver, new IntentFilter(Intent.ACTION_PACKAGE_ADDED));
    }
    }
    

更新2

  • Intent.ACTION_PACKAGE_INSTALL

      

    @deprecated从未使用过此常量。

  • Intent.ACTION_PACKAGE_ADDED

      

    广播操作:设备上已安装了新的应用程序包。数据包含包的名称。   这是受保护的意图,只能由系统发送。

  • Intent.ACTION_MY_PACKAGE_REPLACED

      

    广播操作:已安装了新版本的应用程序

  • Intent.ACTION_PACKAGE_REPLACED

      

    广播操作:已安装新版本的应用程序包,以替换先前安装的现有版本。   数据包含包的名称。