Android啟動(dòng)內(nèi)置APK和動(dòng)態(tài)發(fā)送接收自定義廣播實(shí)例詳解
Android啟動(dòng)內(nèi)置APK和動(dòng)態(tài)發(fā)送接收自定義廣播實(shí)例詳解
工作中遇到這樣一個(gè)需求,需要為按鍵添加一個(gè)親情號(hào),提供一個(gè)接口啟動(dòng)內(nèi)置的APK,思考再三決定更改Framework,利用廣播機(jī)制去實(shí)現(xiàn)。
一、代碼動(dòng)態(tài)自主啟動(dòng)內(nèi)置APK
我們都知道Android系統(tǒng)為我們提供了很多服務(wù)管理類,PackageManager主要是管理應(yīng)用程序包,通過(guò)它就可以獲取應(yīng)用程序信息并構(gòu)建Intent,啟動(dòng)對(duì)應(yīng)的應(yīng)用。除此之外Android還未我們提供了一些對(duì)應(yīng)的類來(lái)管理相關(guān)的xml文件,比如說(shuō)可以通過(guò)PackageInfo來(lái)獲取AndroidManifest.xml文件的信息;PackageItemInfo——AndroidManifest.xml文件中所有節(jié)點(diǎn)的基類,提供了這些節(jié)點(diǎn)的基本信息比如label、icon、 meta-data。但它并不直接使用,而是由子類繼承然后調(diào)用相應(yīng)方法;ApplicationInfo繼承自 PackageItemInfo用于獲取一個(gè)特定程序中節(jié)點(diǎn)的信息,比如常見(jiàn)的字段:flags字段: **FLAG_SYSTEM 系統(tǒng)應(yīng)用程序、FLAG_EXTERNAL_STORAGE 表示該應(yīng)用安裝在sdcard中;ActivityInfo也繼承自 PackageItemInfo用于獲得應(yīng)用程序中或者 節(jié)點(diǎn)的信息 。我們可以通過(guò)它來(lái)獲取我們?cè)O(shè)置的任何屬性比如:theme 、launchMode、launchmode等,還有ServiceInfo與ActivityInfo類似,只不過(guò)是用于獲取節(jié)點(diǎn)的信息;最后一個(gè)ResolveInfo是基于節(jié)點(diǎn)來(lái)獲取其上一層目錄的信息,比如說(shuō)、、節(jié)點(diǎn)信息。

1、PackageManager簡(jiǎn)介
PackageManager主要用于管理應(yīng)用程序包,獲取程序中所安裝的應(yīng)用程序包的相關(guān)信息,而且是一個(gè)抽象類,但是我們可以通過(guò)getPackageManager()方法來(lái)獲取PackageManager對(duì)象。

2、代碼實(shí)現(xiàn)
包名和mainActivity未知時(shí):
/*
** @param packageName 將要去啟動(dòng)第三方app的package
*/
private void runAppByPackage(@NonNull String packageName) {
PackageInfo packageInfo = null;
PackageManager packageManager=getPackageManager();//獲取PackageManager對(duì)象
try {
packageInfo = packageManager.getPackageInfo(packageName, 0);//通過(guò)包名獲取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已知時(shí):
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) {
}
}
**二、動(dòng)態(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、注冊(cè)廣播接收器
@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);// 注冊(cè)廣播接收器
}
4、使用完畢之后記得釋放掉廣播,否則會(huì)有OOM的隱患
unregisterReceiver(receiver);
這是最簡(jiǎn)單的內(nèi)置APK和發(fā)送廣播方式,
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
相關(guān)文章
Android采用消息推送實(shí)現(xiàn)類似微信視頻接聽(tīng)
這篇文章主要為大家詳細(xì)介紹了Android采用消息推送實(shí)現(xiàn)類似微信視頻接聽(tīng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-11-11
Android讀取用戶號(hào)碼,手機(jī)串號(hào),SIM卡序列號(hào)的實(shí)現(xiàn)代碼
以下是對(duì)Android讀取用戶號(hào)碼,手機(jī)串號(hào),SIM卡序列號(hào)的實(shí)現(xiàn)代碼進(jìn)行了介紹,需要的朋友可以過(guò)來(lái)參考下2013-07-07
Android切換前后臺(tái)點(diǎn)擊通知進(jìn)入當(dāng)前頁(yè)面
這篇文章主要介紹了Android切換前后臺(tái)點(diǎn)擊通知進(jìn)入當(dāng)前頁(yè)面,主要講述當(dāng)App退出到后臺(tái)的后,怎么點(diǎn)擊通知回到原來(lái)按下HOME鍵之前的前臺(tái)頁(yè)面,需要的朋友可以參考下2023-03-03
Android中butterknife的使用與自動(dòng)化查找組件插件詳解
這篇文章主要給大家介紹了關(guān)于Android中butterknife的使用與自動(dòng)化查找組件插件的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)各位Android開(kāi)發(fā)者們具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10
Android原生實(shí)現(xiàn)多線程斷點(diǎn)下載實(shí)例代碼
本篇文章主要介紹了Android原生實(shí)現(xiàn)多線程斷點(diǎn)下載實(shí)例代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05
使用Android Studio實(shí)現(xiàn)為系統(tǒng)級(jí)的app簽名
這篇文章主要介紹了使用Android Studio實(shí)現(xiàn)為系統(tǒng)級(jí)的app簽名,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-03-03
Android開(kāi)發(fā):TextView加入滾動(dòng)條示例
利用scrollview來(lái)實(shí)現(xiàn)TextView中滾動(dòng)條效果會(huì)好很多,具體代碼如下,感興趣的朋友可以參考下哈2013-06-06
Android實(shí)現(xiàn)網(wǎng)絡(luò)加載時(shí)的對(duì)話框功能
這篇文章主要介紹了Android實(shí)現(xiàn)網(wǎng)絡(luò)加載時(shí)的對(duì)話框功能,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-02-02
Android實(shí)現(xiàn)點(diǎn)擊Button產(chǎn)生水波紋效果
這篇文章主要介紹了Android實(shí)現(xiàn)點(diǎn)擊Button產(chǎn)生水波紋效果,需要的朋友可以參考下2016-01-01

