安卓软件安装成功后通过广播-接收器删除apk文件

来源:互联网 发布:群星修改数据 编辑:程序博客网 时间:2024/05/17 22:19

在安卓APP项目开发中,我们有这样的需求:

APP安装更新完成后,需要把 APK 文件删除

这里,我们可以通过安卓四大组件之一 —— 广播-接收器,来助阵。

广播有动态注册和静态注册两种方式,此处用静态注册方式。

在 AndroidManifest.xml 文件中静态注册广播接收器:

<receiver android:name="具体包名.广播接收器名"            android:enabled="true">            <intent-filter>                <action android:name="android.intent.action.PACKAGE_ADDED" />                <action android:name="android.intent.action.PACKAGE_REPLACED" />                <action android:name="android.intent.action.PACKAGE_REMOVED" />                <!--涉及到存储卡状态改变的时候必须添加-->                <data android:scheme="package" />            </intent-filter>        </receiver>

几个 intent-filter name 相信从名字就能知道什么意思了。

  • PACKAGE_ADDED 接受包被添加时发送的广播
  • PACKAGE_REPLACED 接受包被替换时发送的广播
  • PACKAGE_REMOVED 接受包被移除时发送的广播

安卓系统在我们安装或卸载APP等操作时,会发送以上的一些广播包,我们这里设个接收器来”监听“这些操作的发生。

新建一个类,继承自 BroadcastReceiver,重写 onReceive 方法,具体逻辑处理可在此书写。

package 包名;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.os.Environment;import android.util.Log;import java.io.File;/** * Created by Moses on 2017/12/5. * * PackageInstallSuccessfulReceiver * * 接受 广播 软件包被添加、删除和替换时发出 * */public class PackInstSucRecei extends BroadcastReceiver {    private String apkfileName = "app-debug.apk";    @Override    public void onReceive(Context context, Intent intent) {        if (Intent.ACTION_PACKAGE_ADDED.equals(intent.getAction())) {            Log.d(TAG, "监听到系统广播,包被添加: ");            //删除apk文件            deleteApkfile(apkfileName);        }        if (Intent.ACTION_PACKAGE_REMOVED.equals(intent.getAction())) {            Log.d(TAG, "监听到系统广播,包被移除: ");            Log.d(TAG, "onReceive: " + intent.getDataString());        }        if (Intent.ACTION_PACKAGE_REPLACED.equals(intent.getAction())) {            Log.d(TAG, "监听到系统广播,包被替换: ");            Log.d(TAG, "onReceive: "+ intent.getPackage());            deleteApkfile(apkfileName);        }    }    public Boolean deleteApkfile(String apkFileName){        //Apk文件路径可自定义,此处用 download 文件夹        File apkfile = new File(Environment                .getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)                .getPath(), apkFileName);        if (!apkfile.exists()) {            Log.d(TAG, "apkfile delete already! ");        } else {            //调用现成的文件操作方法删除文件            if (apkfile.delete())                Log.d(TAG, "apkfile delete successfully! ");        }        return false;    }}

满足这个需求其实很简单,重要在于我们得先知道,”原来还可以这样做”,换句话说:我们得现有这样的认知!

认知比知识更重要

know How | Why, and then do it and make it perfect !