国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Android > 正文

Android啟動內(nèi)置APK和動態(tài)發(fā)送接收自定義廣播實例詳解

2019-10-22 18:33:41
字體:
供稿:網(wǎng)友

Android啟動內(nèi)置APK和動態(tài)發(fā)送接收自定義廣播實例詳解

工作中遇到這樣一個需求,需要為按鍵添加一個親情號,提供一個接口啟動內(nèi)置的APK,思考再三決定更改Framework,利用廣播機制去實現(xiàn)。

一、代碼動態(tài)自主啟動內(nèi)置APK

我們都知道Android系統(tǒng)為我們提供了很多服務(wù)管理類,PackageManager主要是管理應(yīng)用程序包,通過它就可以獲取應(yīng)用程序信息并構(gòu)建Intent,啟動對應(yīng)的應(yīng)用。除此之外Android還未我們提供了一些對應(yīng)的類來管理相關(guān)的xml文件,比如說可以通過PackageInfo來獲取AndroidManifest.xml文件的信息;PackageItemInfo——AndroidManifest.xml文件中所有節(jié)點的基類,提供了這些節(jié)點的基本信息比如label、icon、 meta-data。但它并不直接使用,而是由子類繼承然后調(diào)用相應(yīng)方法;ApplicationInfo繼承自 PackageItemInfo用于獲取一個特定程序中節(jié)點的信息,比如常見的字段:flags字段: **FLAG_SYSTEM 系統(tǒng)應(yīng)用程序、FLAG_EXTERNAL_STORAGE 表示該應(yīng)用安裝在sdcard中;ActivityInfo也繼承自 PackageItemInfo用于獲得應(yīng)用程序中或者 節(jié)點的信息 。我們可以通過它來獲取我們設(shè)置的任何屬性比如:theme 、launchMode、launchmode等,還有ServiceInfo與ActivityInfo類似,只不過是用于獲取節(jié)點的信息;最后一個ResolveInfo是基于節(jié)點來獲取其上一層目錄的信息,比如說、、節(jié)點信息。

Android啟動內(nèi)置APK和動態(tài)發(fā)送接收自定義廣播,Android,啟動內(nèi)置APK并廣播

1、PackageManager簡介

PackageManager主要用于管理應(yīng)用程序包,獲取程序中所安裝的應(yīng)用程序包的相關(guān)信息,而且是一個抽象類,但是我們可以通過getPackageManager()方法來獲取PackageManager對象。

Android啟動內(nèi)置APK和動態(tài)發(fā)送接收自定義廣播,Android,啟動內(nèi)置APK并廣播

2、代碼實現(xiàn)

包名和mainActivity未知時:

/*** @param packageName 將要去啟動第三方app的package*/private void runAppByPackage(@NonNull String packageName) {  PackageInfo packageInfo = null;  PackageManager packageManager=getPackageManager();//獲取PackageManager對象  try {    packageInfo = packageManager.getPackageInfo(packageName, 0);//通過包名獲取PackInfo  } catch (PackageManager.NameNotFoundException e) {    e.printStackTrace();  }  Intent resolveIntent = new Intent(Intent.ACTION_MAIN, null);  resolveIntent.addCategory(Intent.CATEGORY_LAUNCHER);  resolveIntent.setPackage(packageInfo.packageName);  List<ResolveInfo> apps = packageManager.queryIntentActivities(resolveIntent, 0);  ResolveInfo resolveInfo = apps.iterator().next();  if (resolveInfo != null ) {    String pkgeName = resolveInfo.activityInfo.packageName;    String className = resolveInfo.activityInfo.name;    Intent intent = new Intent(Intent.ACTION_MAIN);    intent.addCategory(Intent.CATEGORY_LAUNCHER);    ComponentName cn = new ComponentName(pkgeName, className);    intent.setComponent(cn);    startActivity(intent);  }  }

包名和mainActivity已知時:

private void startLenovePlan(){  ComponentName componetName = new ComponentName(      "com.lenovo.ue.service","com.lenovo.ue.service.LenovoUEServiceActivity");    try {      Intent intent = new Intent();      intent.setComponent(componetName);      startActivity(intent);    } catch (Exception e) {    }    }

**二、動態(tài)發(fā)送和接收廣播

1、發(fā)送自定義廣播**

Intent intent = new Intent("android.intent.action.CART_BROADCAST_SILENT");mContext.sendBroadcast(intent);

2、定義廣播接收器并處理

private static String BROADCAST_FILTER="android.intent.action.CART_BROADCAST_SILENT";private AudioManager mAudioManager=(AudioManager) (getActivity().getApplicationContext().getSystemService(Context.AUDIO_SERVICE));private BroadcastReceiver zenmodeReceiver = new BroadcastReceiver() {  //定義接收廣播接收器  @Override  public void onReceive(Context contex, Intent intent) {    String action = intent.getAction();    PreferenceScreen sound = (PreferenceScreen) findPreference("hq_ringtone_volume_settings");    if (action.equals(BROADCAST_FILTER)) {      int ringMode = mAudioManager.getRingerMode();      if (ringMode == AudioManager.RINGER_MODE_SILENT) {        if (findPreference(KEY_RING_VOLUME) != null && findPreference(KEY_NOTIFICATION_VOLUME) != null) {          ((VolumeSeekBarPreference) findPreference(KEY_RING_VOLUME)).setSeekBarStatus(false, 0);        }      } else {        if (findPreference(KEY_RING_VOLUME) != null && findPreference(KEY_NOTIFICATION_VOLUME) != null) {          findPreference(KEY_RING_VOLUME).setEnabled(false);        }      }    }  }  };

3、注冊廣播接收器

@Overridepublic void onCreate(Bundle icicle) { super.onCreate(icicle); addPreferencesFromResource(R.xml.hq_volume_fragment_prefs); initVolume(getPreferenceScreen()); IntentFilter intent = new IntentFilter(); intent.addAction(BROADCAST_FILTER); getActivity().getApplicationContext().registerReceiver(zenmodeReceiver,intent);//   注冊廣播接收器}

4、使用完畢之后記得釋放掉廣播,否則會有OOM的隱患

 unregisterReceiver(receiver);

這是最簡單的內(nèi)置APK和發(fā)送廣播方式,

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!


注:相關(guān)教程知識閱讀請移步到Android開發(fā)頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 珠海市| 河东区| 太仆寺旗| 格尔木市| 黄平县| 广南县| 赤水市| 共和县| 六盘水市| 紫阳县| 昌乐县| 汕尾市| 漳浦县| 兴隆县| 连州市| 麦盖提县| 大悟县| 溧水县| 慈溪市| 绥德县| 芜湖市| 清新县| 青川县| 若羌县| 武乡县| 祁门县| 禹州市| 耒阳市| 平凉市| 苗栗市| 贞丰县| 西畴县| 项城市| 敦化市| 唐河县| 麦盖提县| 滨海县| 巴南区| 靖江市| 东安县| 绵阳市|