Android BroadcastReceiver,广播与进程通讯,APK安装广播,获取已安装列表

安装失败

android.injected.testOnly=false

 

1、创建广播接收器:

/**
 * 作者:created by meixi
 * 邮箱:13164716840@163.com
 * 日期:2018/11/1 09
 */
public class MyBroadcastReceiver extends BroadcastReceiver {

    //需要实现的方法
    @Override
    public void onReceive(Context context, Intent intent) {

        Log.i("lgq","sssssssMyBroadcastReceiver"+intent.getStringExtra("br"));

    }
}

2、静态注册广播

<receiver android:name="com.administrator.receivers.MyBroadcastReceiver"
    android:exported="true"
    android:enabled="true">

    <intent-filter>
        <action android:name="com.weimore.example.MY_BROADCAST"/>
    </intent-filter>
</receiver>

3、动态注册广播

//自定义的广播接收器
MyBroadcastReceiver mReceiver = new MyBroadcastReceiver();
//过滤器,其中传入一个action
IntentFilter filter = new IntentFilter("com.weimore.example.MY_BROADCAST");
//注册广播
registerReceiver(mReceiver,filter);

需要注意的是,动态注册的广播接收器一定要注销,在onDestroy方法中调用unregisterReceiver(recevier);

4、发送广播

                //创建Intent对象
                Intent intent = new Intent();
//                Intent intent = new Intent( MainActivity.this, MyBroadcastReceiver.class);//静态注册写法
                //指定action
                intent.setAction("com.weimore.example.MY_BROADCAST");//动态注册写法
                intent.putExtra("br","llllgggqqq");
                //发送广播
                sendBroadcast(intent);

5、外部应用通过action发送广播,实现进程间通讯

                Intent intent = new Intent();
//                Intent intent = new Intent( MainActivity.this, MyBroadcastReceiver.class);
                //指定action
                intent.setAction("com.weimore.example.MY_BROADCAST");
                intent.putExtra("br","llllgggqqqweilaisssss");
                //发送广播
                sendBroadcast(intent);

 6、系统广播使用

public class BluetoothReceiver extends BroadcastReceiver {

    private BaseConfigCallback mCallback;

    public BluetoothReceiver(Context context, BaseConfigCallback callback) {
        mCallback = callback;
        IntentFilter filter = new IntentFilter();

        filter.addAction(Intent.ACTION_SCREEN_OFF);
        filter.addAction(Intent.ACTION_SCREEN_ON);
        filter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);

        //蓝牙开关状态
        filter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED);
        //蓝牙开始搜索
        filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_STARTED);
        //蓝牙搜索结束
        filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);

        //蓝牙发现新设备(未配对)
        filter.addAction(BluetoothDevice.ACTION_FOUND);
        //设备配对状态改变
        filter.addAction(BluetoothDevice.ACTION_BOND_STATE_CHANGED);
        //设备建立连接
        filter.addAction(BluetoothDevice.ACTION_ACL_CONNECTED);
        //设备断开连接
        filter.addAction(BluetoothDevice.ACTION_ACL_DISCONNECTED);

        //BluetoothAdapter连接状态
        filter.addAction(BluetoothAdapter.ACTION_CONNECTION_STATE_CHANGED);
        //BluetoothHeadset连接状态
        filter.addAction(BluetoothHeadset.ACTION_CONNECTION_STATE_CHANGED);
        //BluetoothA2dp连接状态
        filter.addAction(BluetoothA2dp.ACTION_CONNECTION_STATE_CHANGED);

        context.registerReceiver(this, filter);
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        Log.i("lgq","状态=-----"+action);
        BluetoothDevice dev;
        int state;
        if (action == null) {
            return;
        }
        switch (action) {
            /**
             * 蓝牙开关状态
             * int STATE_OFF = 10; //蓝牙关闭
             * int STATE_ON = 12; //蓝牙打开
             * int STATE_TURNING_OFF = 13; //蓝牙正在关闭
             * int STATE_TURNING_ON = 11; //蓝牙正在打开
             */
            case BluetoothAdapter.ACTION_STATE_CHANGED:
                state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, 0);
                mCallback.onStateSwitch(state);
                break;
            /**
             * 蓝牙开始搜索
             */
            case BluetoothAdapter.ACTION_DISCOVERY_STARTED:
                CbtLogs.i("蓝牙开始搜索");
                break;
            /**
             * 蓝牙搜索结束
             */
            case BluetoothAdapter.ACTION_DISCOVERY_FINISHED:
                CbtLogs.i("蓝牙扫描结束");
                mCallback.onScanStop();
                break;
            /**
             * 发现新设备
             */
            case BluetoothDevice.ACTION_FOUND:
                dev = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
                mCallback.onFindDevice(dev);
                break;
            /**
             * 设备配对状态改变
             * int BOND_NONE = 10; //配对没有成功
             * int BOND_BONDING = 11; //配对中
             * int BOND_BONDED = 12; //配对成功
             */
            case BluetoothDevice.ACTION_BOND_STATE_CHANGED:
                dev = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
                CbtLogs.i("设备配对状态改变:" + dev.getBondState());
                break;
            /**
             * 设备建立连接
             * int STATE_DISCONNECTED = 0; //未连接
             * int STATE_CONNECTING = 1; //连接中
             * int STATE_CONNECTED = 2; //连接成功
             */
            case BluetoothDevice.ACTION_ACL_CONNECTED:
                dev = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
                CbtLogs.i("设备建立连接:" + dev.getBondState());
                mCallback.onConnect(dev);
                break;
            /**
             * 设备断开连接
             */
            case BluetoothDevice.ACTION_ACL_DISCONNECTED:
                dev = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
                // mCallback.onConnect(dev.getBondState(), dev);
                break;
            /**
             * 本地蓝牙适配器
             * BluetoothAdapter连接状态
             */
            case BluetoothAdapter.ACTION_CONNECTION_STATE_CHANGED:
                dev = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
                CbtLogs.i("STATE: " + intent.getIntExtra(BluetoothAdapter.EXTRA_CONNECTION_STATE, 0));
                CbtLogs.i("BluetoothDevice: " + dev.getName() + ", " + dev.getAddress());
                break;
            /**
             * 提供用于手机的蓝牙耳机支持
             * BluetoothHeadset连接状态
             */
            case BluetoothHeadset.ACTION_CONNECTION_STATE_CHANGED:
                dev = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
                CbtLogs.i("STATE: " + intent.getIntExtra(BluetoothHeadset.EXTRA_STATE, 0));
                CbtLogs.i("BluetoothDevice: " + dev.getName() + ", " + dev.getAddress());
                break;
            /**
             * 定义高质量音频可以从一个设备通过蓝牙连接传输到另一个设备
             * BluetoothA2dp连接状态
             */
            case BluetoothA2dp.ACTION_CONNECTION_STATE_CHANGED:
                dev = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
                CbtLogs.i("STATE: " + intent.getIntExtra(BluetoothHeadset.EXTRA_STATE, 0));
                CbtLogs.i("BluetoothDevice: " + dev.getName() + ", " + dev.getAddress());
                break;
            default:
                break;
        }
    }
}

注册广播

private BluetoothReceiver mBluetoothReceiver;
mBluetoothReceiver = new BluetoothReceiver(mContext, this);

/**
 * 关闭服务
 */
public void onDestroy() {

    mContext.unregisterReceiver(mBluetoothReceiver);
}

APK安装广播

<!--接收apk安装事件-->
<receiver android:name=".utils.AutoStarterReceiver">
    <intent-filter>
        <action android:name="android.intent.action.PACKAGE_REPLACED" />
        <action android:name="android.intent.action.PACKAGE_ADDED" />
        <action android:name="android.intent.action.PACKAGE_CHANGED" />
        <action android:name="android.intent.action.PACKAGE_INSTALL" />
        <action android:name="android.intent.action.PACKAGE_REMOVED" />

        <data android:scheme="package" />
    </intent-filter>
</receiver>

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission
        android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"
        tools:ignore="ProtectedPermissions" />


    <uses-permission
        android:name="android.permission.INSTALL_PACKAGES"
        tools:ignore="ProtectedPermissions" />
    <uses-permission android:name="android.permission.HIDE_INSTALL_PACKAGES" />
 

/**
 * @author : LGQ
 * @date : 2020/12/10 10
 * @desc :
 */
public class AutoStarterReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        //todo 启动目标app
        Log.e("###", "接收到apk安装广播");
        Toast.makeText(context, "接收到apk安装广播", Toast.LENGTH_LONG).show();
    }
}

第一种:

Intent settintIntent = context.getPackageManager().
                                getLaunchIntentForPackage("包名");
 context.startActivity(settintIntent);
第二种:

Intent intent2 = mContext.getPackageManager()
        .getLaunchIntentForPackage(packagename);
String classNameString = intent2.getComponent().getClassName();//得到app类名
Intent intent  = new Intent();
intent.setAction(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
        | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
intent.setComponent(new ComponentName(packagename, classNameString));
mContext.startActivity(intent);

获取安装列表

private void getAppList() {
    PackageManager pm = getPackageManager();
    // Return a List of all packages that are installed on the device.
    List<PackageInfo> packages = pm.getInstalledPackages(0);
    Log.e("lgq","列表==== "+MyByteUtil.parseObjToJsonStr(packages));
    for (PackageInfo packageInfo : packages) {
        // 判断系统/非系统应用
        if ((packageInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0) // 非系统应用
        {
            System.out.println("MainActivity.getAppList, packageInfo=" + packageInfo.packageName);
        } else {
            // 系统应用
        }
    }
}

public static int isNewAppVersionCode(Context context, String packageName){
    int appVersionCode = 0;

    PackageManager packageManager = context.getApplicationContext().getPackageManager();
    try{
        PackageInfo packageInfo = packageManager.getPackageInfo(packageName,PackageManager.GET_GIDS);
       if(packageInfo!=null){
           appVersionCode = packageInfo.versionCode;
       }
    }catch(Exception e) {
        AppLog.Loge("版本号获取失败,没办法,packageName:"+packageName);
        e.printStackTrace();
    }
    return appVersionCode;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值