Android 监听程序的安装和卸载

有些时候,需要监听到程序是否安装或者卸载成功,在android系统中,安装和卸载都会发送广播,当应用安装完成后系统会发android.intent.action.PACKAGE_ADDED广播。可以通过intent.getDataString()获得所安装的包名。当卸载程序时系统发android.intent.action.PACKAGE_REMOVED广播。同样intent.getDataString()获得所卸载的包名。

所以,只需要自定义一个BroadcastReceiver,来对系统广播进行监听和处理。

1、自定义广播
自定义广播MyInstalledReceiver继承自BroadcastReceiver,实现其onReceive()方式,具体代码如下:

[html][/html]

view plaincopy

  1. import android.content.BroadcastReceiver;
  2. import android.content.Context;
  3. import android.content.Intent;
  4. public class BootReceiver extends BroadcastReceiver{
  5.     @Override
  6.     public void onReceive(Context context, Intent intent){
  7.         //接收安装广播
  8.         if (intent.getAction().equals(“android.intent.action.PACKAGE_ADDED”)) {
  9.             String packageName = intent.getDataString();
  10.             System.out.println(“安装了:” +packageName + “包名的程序”);
  11.         }
  12.         //接收卸载广播
  13.         if (intent.getAction().equals(“android.intent.action.PACKAGE_REMOVED”)) {
  14.             String packageName = intent.getDataString();
  15.             System.out.println(“卸载了:”  + packageName + “包名的程序”);
  16.         }
  17.     }
  18. }

2、注册监听

1) xml 方式:在AndroidManifest.xml 配置文件的Application节点下,添加自定义的注册监听 MyInstalledReceiver,在AndroidManifest.xml 添加的注册监听,其生命周期默认是整个应用的生命周期。

[html][/html]

view plaincopy

  1. <?xml version=”1.0″ encoding=”utf-8″?>
  2. <manifest xmlns:android=”http://schemas.android.com/apk/res/android”
  3.     package=”com.example.apk”
  4.     android:versionCode=”1″
  5.     android:versionName=”1.0″ >
  6.     <application
  7.         android:icon=”@drawable/ic_launcher”
  8.         android:label=”@string/app_name” >
  9.         <activity
  10.             android:name=”.MainActivity”
  11.             android:label=”@string/app_name” >
  12.             <intent-filter>
  13.                 <action android:name=”android.intent.action.MAIN” />
  14.                 <category android:name=”android.intent.category.LAUNCHER” />
  15.             </intent-filter>
  16.         </activity>
  17.         <receiver android:name=”.MyInstalledReceiver” >
  18.             <intent-filter>
  19.                 <action android:name=”android.intent.action.PACKAGE_ADDED” />
  20.                 <action android:name=”android.intent.action.PACKAGE_REMOVED” />
  21.                 <data android:scheme=”package” />
  22.             </intent-filter>
  23.         </receiver>
  24.     </application>
  25.     <uses-sdk android:minSdkVersion=”3″ />
  26. </manifest>

2) 代码方式:一般在Activity的onStart()方法中注册监听,在onDestroy()方法中注销监听(也可以在onStop()方法中注销,其生命周期注销时结束)。

[html][/html]

view plaincopy

  1. @Override
  2. public void onStart(){
  3.     super.onStart();
  4.     installedReceiver = new MyInstalledReceiver();
  5.     IntentFilter filter = new IntentFilter();
  6.     filter.addAction(“android.intent.action.PACKAGE_ADDED”);
  7.     filter.addAction(“android.intent.action.PACKAGE_REMOVED”);
  8.     filter.addDataScheme(“package”);
  9.     this.registerReceiver(installedReceiver, filter);
  10. }
  11. @Override
  12. public void onDestroy(){
  13.     if(installedReceiver != null) {
  14.         this.unregisterReceiver(installedReceiver);
  15.     }
  16.     super.onDestroy();
  17. }

3、存储安装、卸载信息

一般时候,需要使用到程序的安装、卸载信息,所以需要将信息存储起来,比较好的方式是使用Sqlite数据库,也可以使用首选项等。

标签