Android啟動內(nèi)置APK和動態(tài)發(fā)送接收自定義廣播實例詳解
Android啟動內(nèi)置APK和動態(tài)發(fā)送接收自定義廣播實例詳解
工作中遇到這樣一個需求,需要為按鍵添加一個親情號,提供一個接口啟動內(nèi)置的APK,思考再三決定更改Framework,利用廣播機(jī)制去實現(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é)點信息。
1、PackageManager簡介
PackageManager主要用于管理應(yīng)用程序包,獲取程序中所安裝的應(yīng)用程序包的相關(guān)信息,而且是一個抽象類,但是我們可以通過getPackageManager()方法來獲取PackageManager對象。
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、注冊廣播接收器
@Override public 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 Studio 3.0被調(diào)方法參數(shù)名提示的取消方法
這篇文章主要介紹了去掉android studio 3.0被調(diào)方法參數(shù)名提示的解決方法,在文章末尾給大家補充介紹了Android Studio 3.0 gradle提示太老的解決方法,非常不錯,需要的朋友可以參考下2017-11-11Android 通過Messager與Service實現(xiàn)進(jìn)程間雙向通信案例詳解
這篇文章主要介紹了Android 通過Messager與Service實現(xiàn)進(jìn)程間雙向通信案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-09-09Android TextSwitcher實現(xiàn)文字上下翻牌效果(銅板街)
這篇文章主要介紹了Android TextSwitcher實現(xiàn)文字上下翻牌效果(銅板街),需要的朋友可以參考下2017-05-05Android基于ViewFilpper實現(xiàn)文字LED顯示效果示例
這篇文章主要介紹了Android基于ViewFilpper實現(xiàn)文字LED顯示效果,結(jié)合完整實例形式分析了Android使用ViewFilpper實現(xiàn)文字LED顯示動畫效果的相關(guān)步驟與實現(xiàn)技巧,需要的朋友可以參考下2017-08-08View Controller Transition實現(xiàn)京東加購物車效果
這篇文章主要介紹了View Controller Transition實現(xiàn)京東加購物車效果,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2017-02-02Android使用SurfaceView實現(xiàn)飄贊動畫
這篇文章主要為大家詳細(xì)介紹了Android如何使用SurfaceView實現(xiàn)飄贊動畫,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-03-03Android基于TextView不獲取焦點實現(xiàn)跑馬燈效果
這篇文章主要介紹了Android基于TextView不獲取焦點實現(xiàn)跑馬燈效果,結(jié)合實例形式分析了Android基于TextView實現(xiàn)跑馬燈的功能與布局相關(guān)技巧,需要的朋友可以參考下2017-02-02