Android应用安装卸载监控

安装应用

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();
  }
}

调用方式

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();//再次执行安装流程,包含权限判等
    }
  }
}

卸载应用

Uri uri = Uri.fromParts("package", "com.example.demo", null);
Intent intent = new Intent(Intent.ACTION_DELETE, uri);
startActivity(intent);

监听应用安装卸载

XML形式

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

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配置文件,添加广播介绍,添加监听的权限

<?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()方法中注销,其生命周期注销时结束)

@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();
}
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇