有时我们要对安装,卸载,更新等系统动作进行处理
这时我们可以使用广播接收器BroadcastReceiver,作为Android的四大组件
大家也是非常的熟悉了,直接上代码:
/**
* 安装广播
*
* @author Administrator
*/
public class InstallationReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// 接收安装广播
if (intent.getAction().equals("android.intent.action.PACKAGE_ADDED") || Intent.ACTION_PACKAGE_REPLACED.equals(intent.getAction())) {
String packageName = intent.getDataString().split(":")[1];
// ToolUtils.showToast(context, "安装了:" +packageName + "包名的程序");
Logout.log(getClass().getSimpleName(), "安装了:" + packageName + "包名的程序");
DownloadManager downloadManager = DownloadService.getDownloadManager(context);
if (null != downloadManager) {
DownloadInfo info2 = downloadManager.getTaskByPackgeName(packageName);
if (info2 != null) {
Logout.log(getClass().getSimpleName(), "安装时的downloadinfo:" + info2);
info2.setIsInstall(true);
if (info2.isCover()) {
info2.setIsCover(false);
}
downloadManager.appStatus(info2);
downloadManager.deleteFileByTask(context,info2.getTargetPath());
DownloadManager.openApk(context, packageName);
}
}
}
// 接收卸载广播
if (intent.getAction().equals("android.intent.action.PACKAGE_REMOVED")) {
String packageName = intent.getDataString().split(":")[1];
// ToolUtils.showToast(context, "卸载了:" + packageName + "包名的程序");
Logout.log(getClass().getSimpleName(), "卸载了:" + packageName + "包名的程序");
DownloadManager downloadManager = DownloadService.getDownloadManager(context);
if (null != downloadManager) {
DownloadInfo info2 = downloadManager.getTaskByPackgeName(packageName);
Logout.log(getClass().getSimpleName(), "卸载时的安装信息:" + info2);
if (info2 != null && !info2.isCover()) {//不是覆盖安装 是直接卸载
Logout.log(getClass().getSimpleName(), "卸载时的downloadinfo:" + info2);
info2.setState(DownloadManager.NONE);
info2.setIsInstall(false);
info2.setDownloadLength(0);// 接受到卸载的广播
downloadManager.appStatus(info2);
downloadManager.removeTaskFromDisk(info2.getUrl());
}
}
}
}
}
只要是四大组件都必须注册
1. 静态注册 (直接在AndroidManifest中添加的)
<receiver android:name=".broadcastReceiver.DownloadReceiver"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.PACKAGE_ADDED"/>
<action android:name="android.intent.action.PACKAGE_REMOVED"/>
<action android:name="android.intent.action.PACKAGE_REPLACED"/>
<!--这行代码很关键,如果scheme没有指定,那其它的属性均无效-->
<data android:scheme="package"/>
</intent-filter>
</receiver>
2. 动态注册
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_download_manager);
downloadManager = DownloadService.getDownloadManager();
allTask = downloadManager.getAllTask();
ListView listView = (ListView) findViewById(R.id.listView);
adapter = new MyAdapter();
listView.setAdapter(adapter);
downloadManager.getThreadPool().getExecutor().addOnAllTaskEndListener(this);
setupReceiver();
}
// 设置安装下载广播
private void setupReceiver() {
downloadReceiver =new DownloadReceiver() ;
IntentFilter intentFilter=new IntentFilter();
intentFilter.addAction(Intent.ACTION_PACKAGE_ADDED); // 安装
intentFilter.addAction(Intent.ACTION_PACKAGE_REMOVED); // 卸载
intentFilter.addAction(Intent.ACTION_PACKAGE_REPLACED); // 更新
intentFilter.addDataScheme(“package”);
DownloadManagerActivity.this.registerReceiver(downloadReceiver,intentFilter);
}
@Override
protected void onDestroy() {
super.onDestroy();
//记得移除,否者会回调多次
downloadManager.getThreadPool().getExecutor().removeOnAllTaskEndListener(this);
// 别忘了解除绑定
if(null!=downloadReceiver){
unregisterReceiver(downloadReceiver);
}
}