android 开机后加载或不加载控件

以android中Camera应用为例

若设备中存在camera硬件设备,则在launcher中显示camera入口,若不存在则不显示。

1——> packages/apps/Camera/rc/com/android/camera/DisableCameraReceiver.java

每次开机后进行检测

该Receiver用以监听系统完全启动后,检测camera设备数(num>0表示存在)是否存在camera设备,并根据是否存在camera决定加载或者不加载camera应用。主要要注意的方法

  private static final String ACTIVITIES[] = {
      "com.android.camera.CameraLauncher"}; //AndroidManifset.xml中的<category android:name="android.intent.category.LAUNCHER"/>
                                              设置camera在launcher中启动的android:name
  
  public void onReceive(Context context, Intent intent) {
      .....
      // Disable this receiver so it won't run again.
      disableComponent(context, "com.android.camera.DisableCameraReceiver");
      //这是取消加载该Receiver,也就是只有第一次启动设备后,以后启动设备,该Receiver组件不会再加载,也就是该组件将不会启动。
      每次恢复出厂设置后,重启后都只会启动一次。若camera设备减少,增加或出硬件问题,重启机器后都不会改变。
      去掉该段代码,每次开机后都会去检测camera设备数,来决定加载或不加载camera应用,更灵活,但camera设备硬件出问题
      后重启机器不会加载camera应用。
  }
  //不加载控件
  private void disableComponent(Context context, String klass) {
      ComponentName name = new ComponentName(context, klass);
      PackageManager pm = context.getPackageManager();
      pm.setComponentEnabledSetting(name,
          PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
          PackageManager.DONT_KILL_APP);
  }
  //加载控件
  private void enableComponent(Context context, String klass) {
      ComponentName name = new ComponentName(context, klass);
      PackageManager pm = context.getPackageManager();
      pm.setComponentEnabledSetting(name,
          PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
          PackageManager.DONT_KILL_APP);
  }

2——> packages/apps/Gallery2/Androidmanifset.xmlcamera的配置项在Gallery2中,方便二者之间的数据交互。

      <activity-alias android:icon="@mipmap/ic_launcher_camera"
                      android:label="@string/camera_label"
                      android:name="com.android.camera.CameraLauncher"
                      android:targetActivity="com.android.camera.Camera" >
          <intent-filter>
              <action android:name="android.intent.action.MAIN" />
              <category android:name="android.intent.category.DEFAULT" />
              <category android:name="android.intent.category.LAUNCHER" />
          </intent-filter>
      </activity-alias>
      //加载在launcher中camera的入口类名。
      

3——> packages/apps/Gallery2# cd src/com/android/gallery3d/util/GalleryUtils.java设置Gallery中的方法类。其中也包括判断是否存在camera。

  private static final String CAMERA_LAUNCHER_NAME = "com.android.camera.CameraLauncher";
  public static boolean isCameraAvailable(Context context) {
      if (sCameraAvailableInitialized) return sCameraAvailable;
      PackageManager pm = context.getPackageManager();
      ComponentName name = new ComponentName(context, CAMERA_LAUNCHER_NAME);
      int state = pm.getComponentEnabledSetting(name);
      sCameraAvailableInitialized = true;
      sCameraAvailable =
          (state == PackageManager.COMPONENT_ENABLED_STATE_DEFAULT)
           || (state == PackageManager.COMPONENT_ENABLED_STATE_ENABLED);
      return sCameraAvailable;
  }
  //该方法是获取应用中是否存在camera应用。若不存在则在gallery中去除camera的入口。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值