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);
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);
相关文章推荐
- Android利用系统广播---监听应用程序安装和卸载
- Android利用系统广播---监听应用程序安装和卸载
- Android利用广播监听设备安装和卸载应用程序
- Android利用系统广播---监听应用程序安装和卸载
- Android利用系统广播---监听应用程序安装和卸载
- Android利用系统广播---监听应用程序安装和卸载
- Android利用系统广播---监听应用程序安装和卸载
- Android利用系统广播---监听应用程序安装和卸载
- Android利用系统广播---监听应用程序安装和卸载
- Android利用广播监听设备安装和卸载应用程序
- Android利用广播监听设备安装和卸载应用程序
- Android利用系统广播---监听应用程序安装和卸载
- Android利用系统广播---监听应用程序安装和卸载
- Android利用系统广播---监听应用程序安装和卸载
- Android利用系统广播---监听应用程序安装和卸载
- Android利用系统广播---监听应用程序安装和卸载
- Android利用系统广播---监听应用程序安装和卸载
- 【Android】Android 监听apk安装替换卸载广播
- Android利用Logcat监听应用程序本身被卸载