您的位置:首页 > 移动开发 > Android开发

Android利用广播---监听应用程序安装和卸载,删除安装包

2014-08-16 21:40 399 查看
方法一、 新建监听类:BootReceiver继承BroadcastReceiver

Java代码 

 





public class BootReceiver extends BroadcastReceiver {
  

  

    @Override  

    public void onReceive(Context context, Intent intent) {
  

        //接收广播:系统启动完成后运行程序  

        if (intent.getAction().equals("android.intent.action.BOOT_COMPLETED")) {
  

             Intent newIntent = new Intent(context, WatchInstall.class);
  

newIntent.setAction("android.intent.action.MAIN");             newIntent.addCategory("android.intent.category.LAUNCHER");            newIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);            context.startActivity(newIntent);
  

        }   

        //接收广播:设备上新安装了一个应用程序包后自动启动新安装应用程序。  

        if (intent.getAction().equals("android.intent.action.PACKAGE_ADDED")) {
  

            String packageName = intent.getDataString().substring(8);
  

            System.out.println("---------------" + packageName);
  

            Intent newIntent = new Intent();
  

           newIntent.setClassName(packageName,packageName+ .MainActivity");   

newIntent.setAction("android.intent.action.MAIN");             newIntent.addCategory("android.intent.category.LAUNCHER");             newIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  

            context.startActivity(newIntent);   

        }   

        //接收广播:设备上删除了一个应用程序包。  

        if (intent.getAction().equals("android.intent.action.PACKAGE_REMOVED")) {
  

            System.out.println("********************************");
  

            DatabaseHelper dbhelper = new DatabaseHelper();
  

            dbhelper.executeSql("delete from users");
  

        }   

    }  

[java] view
plaincopy

public class BootReceiver extends BroadcastReceiver {  

  

    @Override  

    public void onReceive(Context context, Intent intent) {  

        //接收广播:系统启动完成后运行程序  

        if (intent.getAction().equals("android.intent.action.BOOT_COMPLETED")) {  

             Intent newIntent = new Intent(context, WatchInstall.class);  

newIntent.setAction("android.intent.action.MAIN");             newIntent.addCategory("android.intent.category.LAUNCHER");            newIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);            context.startActivity(newIntent);  

        }  

        //接收广播:设备上新安装了一个应用程序包后自动启动新安装应用程序。  

        if (intent.getAction().equals("android.intent.action.PACKAGE_ADDED")) {  

            String packageName = intent.getDataString().substring(8);  

            System.out.println("---------------" + packageName);  

            Intent newIntent = new Intent();  

           newIntent.setClassName(packageName,packageName+ .MainActivity");  

newIntent.setAction("android.intent.action.MAIN");             newIntent.addCategory("android.intent.category.LAUNCHER");             newIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  

            context.startActivity(newIntent);  

        }  

        //接收广播:设备上删除了一个应用程序包。  

        if (intent.getAction().equals("android.intent.action.PACKAGE_REMOVED")) {  

            System.out.println("********************************");  

            DatabaseHelper dbhelper = new DatabaseHelper();  

            dbhelper.executeSql("delete from users");  

        }  

    }  

第二、 修改AndroidManifest.xml配置文件

Xml代码 

 





<?xml version="1.0" encoding="UTF-8"?>  

<manifest xmlns:android="http://schemas.android.com/apk/res/android"  

     package="org.me.watchinstall">  

    <application>  

        <receiver android:name=".BootReceiver"  

                  android:label="@string/app_name">  

            <intent-filter>  

                <action android:name="android.intent.action.BOOT_COMPLETED"/>  

                <category android:name="android.intent.category.LAUNCHER" />  

            </intent-filter>  

            <intent-filter>  

             <action android:name="android.intent.action.PACKAGE_ADDED" />  

             <action android:name="android.intent.action.PACKAGE_REMOVED" />  

              <data android:scheme="package" />  

<!-- 注意!! 这句必须要加,否则接收不到BroadCast -->  

            </intent-filter>  

        </receiver>  

        <activity android:name=".WatchInstall" android:label="WatchInstall">  

            <intent-filter>  

                <action android:name="android.intent.action.MAIN"/>  

                <category android:name="android.intent.category.LAUNCHER"/>  

            </intent-filter>  

        </activity>  

    </application>  

    <uses-permission android:name="android.permission.INTERNET" />  

    <uses-permission android:name="android.permission.RESTART_PACKAGES"/>  

    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>  

</manifest>  

方法2:当获取不到安装文件的文件路径时可以采用如下方法:

测试时安装完apk,可以通过广播获取到文件的目录,但是接入到项目中就获取不到。因此通过广播回调进行安装包文件删除。

/**
* 删除安装文件
*
*/
public class RemoveInstallPackUtil {

private Activity activity;
private InstallPackageReceiver installPackageReceiver;

public RemoveInstallPackUtil(Activity act){
activity = act;
}

/**
* 注册包添加和替换广播
* @return
*/
public InstallPackageReceiver registerRemovePackReceiver(){
installPackageReceiver = new InstallPackageReceiver();
IntentFilter mFilter = new IntentFilter();
mFilter.addAction(Intent.ACTION_PACKAGE_ADDED);
mFilter.addAction(Intent.ACTION_PACKAGE_REPLACED);
mFilter.addDataScheme("package");
mFilter.setPriority(Integer.MAX_VALUE);
installPackageReceiver.setInstallFilePath(new DeleteInstallPack());
activity.registerReceiver(installPackageReceiver, mFilter);
return installPackageReceiver;
}
/**
* 释放资源
*/
public void unRegisterPackageReceiver(){
if (installPackageReceiver!=null) {
activity.unregisterReceiver(installPackageReceiver);
}
}

/**
* 删除安装包
*/
private File deleteFile;

public void setDeleteFile(File deleteFile){
this.deleteFile=deleteFile;
}

private boolean isFinishDeleteFile=false;
public class DeleteInstallPack implements InstallFilePath{
@Override
public void delete(String pack) {
if (isFinishDeleteFile) {
return;
}
isFinishDeleteFile=true;
if (PreferencesUtils.getBoolean(activity, Const.Set.INSTALL_FINISH_DELETE,true)) {
//执行安装完成后的操作
remove(deleteFile);
}
}

}
/**
* 安装Apk文件
* @param path
*/
public void installApk(String path) {
if(!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
ToastUtils.showTextToast(activity, "不能执行安装,没有SD卡");
return;
}
File apkfile = new File(path);
if (!apkfile.exists()) {
ToastUtils.showTextToast(activity, "文件不存在");
return;
}
deleteFile = apkfile;
Intent i = new Intent(Intent.ACTION_VIEW);
i.putExtra("data", Uri.parse("file://" + apkfile.toString()));
i.setDataAndType(Uri.parse("file://" + apkfile.toString()),
"application/vnd.android.package-archive");
activity.startActivity(i);
}
/**
* 删除文件
* @param deleteFile
*/
private void remove(final File deleteFile){
if (deleteFile==null || !deleteFile.exists()) {
return;
}
AlertDialog.Builder builder = new AlertDialog.Builder(
activity);
builder.setTitle("提示信息")
.setCancelable(false)
.setMessage("是否删除安装文件")
.setPositiveButton("确定",
new DialogInterface.OnClickListener() {
public void onClick(
DialogInterface dialoginterface, int i) {
if (deleteFile!= null && deleteFile.exists()) {
deleteFile.delete();
ToastUtils.showTextToast(activity, "删除成功");
}else {
ToastUtils.showTextToast(activity, "已被删除");
}
dialoginterface.dismiss();
}
});
builder.setNegativeButton("取消",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.dismiss();
}
});

builder.show();// 显示
}

}
在广播中定义回调接口:
public class InstallPackageReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(Intent.ACTION_PACKAGE_ADDED)||intent.getAction().equals(Intent.ACTION_PACKAGE_REPLACED)) {
if (filePath!=null) {
filePath.delete(intent.getDataString());
}
}
}

public InstallFilePath filePath;

public void setInstallFilePath(InstallFilePath filePath){
this.filePath = filePath;
}

public interface InstallFilePath{
public void delete(String pack);
}
}调用安装:
removeInstallPackUtil.installApk(path);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: