如何在framework层的java类里面发送广播

问题始于我司项目中有一项功能有个服务是长期占用相机资源的,但是偶尔又有使用相机的需求,为避免资源占用冲突,需要在调用底层相机前new camera()对象前去发广播去让我们的服务释放资源
首先我们要从framework/base/core/java/android/hardware/Camera.java
Camera类下手,因为每次打开相机都会走Camera.open(),去new Camera(cameraId)
所以我们将在Camera.open()里面return new Camera(cameraId)之前去发送广播,释放资源,整个过程需要时间,所以在这个位置我加了点延时。

*注意:Camera类中有两个open函数,具体的调用应该是根据软件的api来定的,Camera open(int cameraId) /Camera open(),一个带参数一个不带参数,指定前后摄的。

大家都指定广播方式就是sendBroadcast(i);
想用到这个sendBroadcast,要么你的类继承了context,要么就用context.sendBroadcast(i)

我们这边通过获取context来发送这个广播了

public static Context getApplicationContext() {
        if (null != applicationContext) {
            return applicationContext;
        }
        final Object activityThread = getActivityThread();
        if (null != activityThread) {
            try {
                final Method getApplication = activityThread.getClass().getDeclaredMethod("getApplication");
                getApplication.setAccessible(true);
                applicationContext = (Context) getApplication.invoke(activityThread);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    private static Object getActivityThread() {
        try {
            final Class<?> clz = Class.forName("android.app.ActivityThread");
            final Method method = clz.getDeclaredMethod("currentActivityThread");
            method.setAccessible(true);
            final Object activityThread = method.invoke(null);
            return activityThread;
        } catch(Exception e) {
            e.printStackTrace();
        }
 return null;
    }        

这样我们就通过getApplicationContext拿到context了,然后广播发起来
getApplicationContext().sendBroadcast(i);

同理,可以在release()中去处理关闭相机的时候情况

OK!

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
安卓系统中,控制充电的具体方法如下: 1. 设置充电模式 在BatteryService中,可以设置充电模式,如正常充电模式、快速充电模式、慢速充电模式等。具体的设置方法如下: ```java // 设置充电模式 public void setChargingMode(int mode) { // 根据不同的模式,设置充电电流、电压等参数 switch (mode) { case CHARGING_MODE_NORMAL: setChargingCurrent(NORMAL_CHARGING_CURRENT); setChargingVoltage(NORMAL_CHARGING_VOLTAGE); break; case CHARGING_MODE_FAST: setChargingCurrent(FAST_CHARGING_CURRENT); setChargingVoltage(FAST_CHARGING_VOLTAGE); break; case CHARGING_MODE_SLOW: setChargingCurrent(SLOW_CHARGING_CURRENT); setChargingVoltage(SLOW_CHARGING_VOLTAGE); break; default: break; } } ``` 2. 监测电池状态 在BatteryService中,可以监测电池状态,例如电量、温度、电压等。具体的监测方法如下: ```java // 监测电池状态 public void monitorBatteryStatus() { // 获取电量、温度、电压等信息 int level = getBatteryLevel(); int temperature = getBatteryTemperature(); int voltage = getBatteryVoltage(); // 发送广播通知应用程序 Intent intent = new Intent(BATTERY_STATUS_CHANGED_ACTION); intent.putExtra(EXTRA_BATTERY_LEVEL, level); intent.putExtra(EXTRA_BATTERY_TEMPERATURE, temperature); intent.putExtra(EXTRA_BATTERY_VOLTAGE, voltage); mContext.sendBroadcast(intent); } ``` 3. 控制充电流程 在BatteryService中,可以控制充电流程,例如启动充电、停止充电等。具体的控制方法如下: ```java // 启动充电 public void startCharging() { // 设置充电模式 setChargingMode(CHARGING_MODE_NORMAL); // 开始充电流程 mChargingThread = new ChargingThread(); mChargingThread.start(); } // 停止充电 public void stopCharging() { if (mChargingThread != null) { mChargingThread.interrupt(); mChargingThread = null; } } ``` 总的来说,BatteryService是一个非常重要的系统服务,它负责控制安卓设备的充电流程,同时也提供了一些API,供应用程序获取电池状态、控制充电流程等。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值