前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android应用安装卸载监控

Android应用安装卸载监控

作者头像
码客说
发布2020-09-03 09:27:18
8600
发布2020-09-03 09:27:18
举报
文章被收录于专栏:码客码客

安装应用

代码语言:javascript
复制
public class InstallUtil {
  private Activity mAct;
  private String mPath;//下载下来后文件的路径
  public static int UNKNOWN_CODE = 2018;

  public InstallUtil(Activity mAct, String mPath) {
    this.mAct = mAct;
    this.mPath = mPath;
  }

  public void install(){
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) startInstallO();
    else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) startInstallN();
    else startInstall();
  }

  /**
     * android1.x-6.x
     */
  private void startInstall() {
    Intent install = new Intent(Intent.ACTION_VIEW);
    install.setDataAndType(Uri.parse("file://" + mPath), "application/vnd.android.package-archive");
    install.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    mAct.startActivity(install);
  }

  /**
     * android7.x
     */
  private void startInstallN() {
    //参数1 上下文, 参数2 在AndroidManifest中的android:authorities值, 参数3  共享的文件
    Uri apkUri = FileProvider.getUriForFile(mAct, Constants.AUTHORITY, new File(mPath));
    Intent install = new Intent(Intent.ACTION_VIEW);
    //由于没有在Activity环境下启动Activity,设置下面的标签
    install.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    //添加这一句表示对目标应用临时授权该Uri所代表的文件
    install.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
    install.setDataAndType(apkUri, "application/vnd.android.package-archive");
    mAct.startActivity(install);
  }

  /**
     * android8.x
     */
  @RequiresApi(api = Build.VERSION_CODES.O)
  private void startInstallO() {
    boolean isGranted = mAct.getPackageManager().canRequestPackageInstalls();
    if (isGranted) startInstallN();//安装应用的逻辑(写自己的就可以)
    else new AlertDialog.Builder(mAct)
      .setCancelable(false)
      .setTitle("安装应用需要打开未知来源权限,请去设置中开启权限")
      .setPositiveButton("确定", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface d, int w) {
          Intent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES);
          mAct.startActivityForResult(intent, UNKNOWN_CODE);
        }
      })
      .show();
  }
}

调用方式

代码语言:javascript
复制
public class DownAct extends AppCompatActivity {

  private InstallUtil mInstallUtil;

  @Override
  protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    mInstallUtil = new InstallUtil(this, "");
    mInstallUtil.install();
  }

  @Override
  protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == RESULT_OK && requestCode == InstallUtil.UNKNOWN_CODE) {
      mInstallUtil.install();//再次执行安装流程,包含权限判等
    }
  }
}

卸载应用

代码语言:javascript
复制
Uri uri = Uri.fromParts("package", "com.example.demo", null);
Intent intent = new Intent(Intent.ACTION_DELETE, uri);
startActivity(intent);

监听应用安装卸载

XML形式

1、新建监听类:BootReceiver继承BroadcastReceiver

代码语言:javascript
复制
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

public class BootReceiver extends BroadcastReceiver{
  @Override  
  public void onReceive(Context context, Intent intent){
    //接收安装广播 
    if (intent.getAction().equals("android.intent.action.PACKAGE_ADDED")) {   
      String packageName = intent.getDataString();   
      System.out.println("安装了:" +packageName + "包名的程序");     
    }   
    //接收卸载广播  
    if (intent.getAction().equals("android.intent.action.PACKAGE_REMOVED")) {   
      String packageName = intent.getDataString();   
      System.out.println("卸载了:"  + packageName + "包名的程序");

    }
  }
}

2、 修改AndroidManifest.xml配置文件,添加广播介绍,添加监听的权限

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.rongfzh.yc"
          android:versionCode="1"
          android:versionName="1.0" >

  <uses-sdk android:minSdkVersion="7" />

  <application
               android:icon="@drawable/ic_launcher"
               android:label="@string/app_name" >
    <activity
              android:name=".PakDetectActivity"
              android:label="@string/app_name" >
      <intent-filter>
        <action android:name="android.intent.action.MAIN" />

        <category android:name="android.intent.category.LAUNCHER" />
      </intent-filter>
    </activity>
    <receiver android:name=".BootReceiver"  
              android:label="@string/app_name">   
      <intent-filter>  
        <action android:name="android.intent.action.PACKAGE_ADDED" />  
        <action android:name="android.intent.action.PACKAGE_REMOVED" />  
        <data android:scheme="package" />  
      </intent-filter>  
    </receiver>  
  </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>

3、运行程序,卸载一个程序ApiDemos程序打印日志如下

卸载了​package:com.example.android.apis包名的程序

4、安装腾讯微博,打印日志如下

安装了​package:com.tencent.WBlog包名的程序

代码方式

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

代码语言:javascript
复制
@Override
public void onStart(){
  super.onStart();

  installedReceiver = new MyInstalledReceiver();
  IntentFilter filter = new IntentFilter();

  filter.addAction("android.intent.action.PACKAGE_ADDED");
  filter.addAction("android.intent.action.PACKAGE_REMOVED");
  filter.addDataScheme("package");

  this.registerReceiver(installedReceiver, filter);
}

@Override
public void onDestroy(){
  if(installedReceiver != null) {
    this.unregisterReceiver(installedReceiver);
  }

  super.onDestroy();
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-09-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 安装应用
  • 卸载应用
  • 监听应用安装卸载
    • XML形式
      • 代码方式
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档