android Launcher AppWidget添加步驟介紹
一、AppWidget開機(jī)啟動(dòng)加載
Android系統(tǒng)啟動(dòng),SystemServer創(chuàng)建AppWidgetService,并調(diào)用AppWidgetServiceImpl.onStart()方法,初始化相關(guān)管理器,注冊(cè)四個(gè)廣播接收器:
第一、注冊(cè)有關(guān)軟件包安裝、刪除、改變的廣播,以便我們可以更新provider列表。;
// Register for broadcasts about package install, etc., so we can
// update the provider list.
IntentFilter packageFilter = new IntentFilter();
packageFilter.addAction(Intent.ACTION_PACKAGE_ADDED);
packageFilter.addAction(Intent.ACTION_PACKAGE_CHANGED);
packageFilter.addAction(Intent.ACTION_PACKAGE_REMOVED);
packageFilter.addDataScheme("package");
mContext.registerReceiverAsUser(mBroadcastReceiver, UserHandle.ALL,
packageFilter, null, null);
第二、當(dāng)鎖定狀態(tài)發(fā)生變化時(shí)會(huì)播放一些事件:
IntentFilter offModeFilter = new IntentFilter();
offModeFilter.addAction(Intent.ACTION_MANAGED_PROFILE_AVAILABLE);
offModeFilter.addAction(Intent.ACTION_MANAGED_PROFILE_UNAVAILABLE);
mContext.registerReceiverAsUser(mBroadcastReceiver, UserHandle.ALL,
offModeFilter, null, null);
第三、暫?;蚪獬龝和?yīng)用廣播;
IntentFilter offModeFilter = new IntentFilter();
offModeFilter.addAction(Intent.ACTION_MANAGED_PROFILE_AVAILABLE);
offModeFilter.addAction(Intent.ACTION_MANAGED_PROFILE_UNAVAILABLE);
mContext.registerReceiverAsUser(mBroadcastReceiver, UserHandle.ALL,
offModeFilter, null, null);
第四、注冊(cè)sdcard的安裝與卸載的廣播。
// Register for events related to sdcard installation.
IntentFilter sdFilter = new IntentFilter();
sdFilter.addAction(Intent.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE);
sdFilter.addAction(Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE);
mContext.registerReceiverAsUser(mBroadcastReceiver, UserHandle.ALL,
sdFilter, null, null);
二、Launcher3啟動(dòng)添加
Launcher啟動(dòng)onCreate()方法初始化mAppWidgetManager, mAppWidgetHost對(duì)象,AppWidgetHost是launcher承載AppWidgetView的宿主
mAppWidgetHost.startListening,通過
public void onCreate() {
...
// 13 //得到AppWidget管理實(shí)例 : AppWidgetManager , AppWidgetHost , AppWidgetHostView三個(gè)類的關(guān)系
mAppWidgetManager = AppWidgetManagerCompat.getInstance(this);
mAppWidgetHost = new LauncherAppWidgetHost(this);
// Host啟動(dòng)監(jiān)聽,監(jiān)聽LauncherProvider中的數(shù)據(jù)改變
mAppWidgetHost.startListening();
...
}
1、初始化AppWidgetHostd對(duì)象,創(chuàng)建用于回調(diào)的Callbacks服務(wù)類IAppWidgetHost.Stub, 綁定服務(wù)bindService,得到IAppWidgetService對(duì)象,進(jìn)行l(wèi)auncher和AppWidgetService之間的調(diào)用
public AppWidgetHost(Context context, int hostId, InteractionHandler handler, Looper looper) {
mContextOpPackageName = context.getOpPackageName();
mHostId = hostId;
mInteractionHandler = handler;
mHandler = new UpdateHandler(looper);
mCallbacks = new Callbacks(mHandler);
mDisplayMetrics = context.getResources().getDisplayMetrics();
bindService(context);
}
2、在startListening 方法中 ,通過IAppWidgetService.startListening 方法解析Launcher中的AppWidget信息保存到系統(tǒng)服務(wù)成員變量中, 3、當(dāng)添加AppWidget時(shí),首頁(yè)返回到Launcher中的onActivityResult中,在handleActivityResult中
addAppWidgetImpl(
appWidgetId, requestArgs, null,
requestArgs.getWidgetHandler(),
ON_ACTIVITY_RESULT_ANIMATION_DELAY);
創(chuàng)建添加小部件意圖,之后返回到onActivityForResult,調(diào)用completeAddAppWidget,通過IAppWidgetService.getAppWidgetInfo,獲取AppWidgetProviderInfo,保存到本地?cái)?shù)據(jù)庫(kù)中addItemToDatabase(),
@Thunk void completeAddAppWidget(int appWidgetId, ItemInfo itemInfo,
1070 AppWidgetHostView hostView, LauncherAppWidgetProviderInfo appWidgetInfo) {
1071
1072 if (appWidgetInfo == null) {
1073 appWidgetInfo = mAppWidgetManager.getLauncherAppWidgetInfo(appWidgetId);
1074 }
1075
1076 LauncherAppWidgetInfo launcherInfo;
1077 launcherInfo = new LauncherAppWidgetInfo(appWidgetId, appWidgetInfo.provider);
1078 launcherInfo.spanX = itemInfo.spanX;
1079 launcherInfo.spanY = itemInfo.spanY;
1080 launcherInfo.minSpanX = itemInfo.minSpanX;
1081 launcherInfo.minSpanY = itemInfo.minSpanY;
1082 launcherInfo.user = appWidgetInfo.getProfile();
1083
1084 getModelWriter().addItemToDatabase(launcherInfo,
1085 itemInfo.container, itemInfo.screenId, itemInfo.cellX, itemInfo.cellY);
1086
1087 if (hostView == null) {
1088 // Perform actual inflation because we're live
1089 hostView = mAppWidgetHost.createView(this, appWidgetId, appWidgetInfo);
1090 }
1091 hostView.setVisibility(View.VISIBLE);
1092 prepareAppWidget(hostView, launcherInfo);
1093 mWorkspace.addInScreen(hostView, launcherInfo);
1094 }
1095
1096 private void prepareAppWidget(AppWidgetHostView hostView, LauncherAppWidgetInfo item) {
1097 hostView.setTag(item);
// 計(jì)算AppWidget的顯示大小位置
1098 item.onBindAppWidget(this, hostView);
1099 hostView.setFocusable(true);
1100 hostView.setOnFocusChangeListener(mFocusHandler);
1101 }
并創(chuàng)建AppWidgetHostView 對(duì)象,mAppWidgetHost.createView,返回RemoteView對(duì)象,IAppWidgetService。getAppWidgetViews()
public final AppWidgetHostView createView(Context context, int appWidgetId,
AppWidgetProviderInfo appWidget) {
if (sService == null) {
return null;
}
AppWidgetHostView view = onCreateView(context, appWidgetId, appWidget);
view.setInteractionHandler(mInteractionHandler);
view.setAppWidget(appWidgetId, appWidget);
synchronized (mViews) {
mViews.put(appWidgetId, view);
}
RemoteViews views;
try {
views = sService.getAppWidgetViews(mContextOpPackageName, appWidgetId);
} catch (RemoteException e) {
throw new RuntimeException("system server dead?", e);
}
view.updateAppWidget(views);
return view;
}
調(diào)用AppWidgetHostView.updateAppWidget(views);更新View到launcher界面上mWorkspace.addInScreen(hostView, launcherInfo);
當(dāng)AppWidgetProvider獲得更新的廣播,并執(zhí)行onUpdate(),onUpdate()中創(chuàng)建了RemoteViews并通過AppWidgetManager.updateAppWidget()更新到AppWidgetService之后,AppWidgetService會(huì)通過注冊(cè)的IAppWidgetHost的回調(diào),執(zhí)行AppWidgetHost的更新。
總結(jié)
到此這篇關(guān)于android Launcher AppWidget添加步驟介紹的文章就介紹到這了,更多相關(guān)android Launcher AppWidget內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用Flutter開發(fā)一個(gè)圖片UI組件的代碼示例
在移動(dòng)應(yīng)用開發(fā)中,圖片展示是一個(gè)常見的需求,為了滿足不同場(chǎng)景的圖片展示需求,我們可以開發(fā)一個(gè)靈活配置的圖片UI組件,本文將介紹如何使用Flutter開發(fā)一個(gè)圖片UI組件,并提供了豐富的配置選項(xiàng),需要的朋友可以參考下2023-09-09
Android開發(fā)服務(wù)Service全面講解
Android的服務(wù)是開發(fā)Android應(yīng)用程序的重要組成部分。不同于活動(dòng)Activity,服務(wù)是在后臺(tái)運(yùn)行,服務(wù)沒有接口,生命周期也與活動(dòng)Activity非常不同。通過使用服務(wù)我們可以實(shí)現(xiàn)一些后臺(tái)操作,比如想從遠(yuǎn)程服務(wù)器加載一個(gè)網(wǎng)頁(yè)等,下面來看看詳細(xì)內(nèi)容,需要的朋友可以參考下2023-02-02
Android實(shí)現(xiàn)環(huán)形進(jìn)度條代碼
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)環(huán)形進(jìn)度條的代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-01-01
Android選擇與上傳圖片之PictureSelector教程
這篇文章主要介紹了在Android中對(duì)于圖片的選擇與上傳方法,本文介紹了PictureSelector的相關(guān)使用教程,學(xué)習(xí)Android的同學(xué)進(jìn)來看看吧2021-08-08
Android入門之ViewFlipper翻轉(zhuǎn)視圖的使用詳解
本篇給大家?guī)Я说氖荲iewFlipper,它是Android自帶的一個(gè)多頁(yè)面管理控件,且可以自動(dòng)播放!本篇我們我們會(huì)使用兩個(gè)例子:一個(gè)自動(dòng)播放首頁(yè)輪播頁(yè)一個(gè)手動(dòng)可左右滑動(dòng)道頁(yè)的輪播頁(yè)來說透這個(gè)組件的使用,感興趣的可以了解一下2022-11-11
Android Studio Kotlin代碼和java代碼相互轉(zhuǎn)化實(shí)例
這篇文章主要介紹了Android Studio Kotlin代碼和java代碼相互轉(zhuǎn)化實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-03-03
android 為應(yīng)用程序創(chuàng)建桌面快捷方式技巧分享
手機(jī)裝的軟件過多,找起來很不方便,所以在主頁(yè)面有一個(gè)快捷方式的話會(huì)很不錯(cuò)的,本文將介紹如何實(shí)現(xiàn),需要了解跟多的朋友可以參考下2012-12-12
Android Studio 3.5版本JNI生成SO文件詳解
這篇文章主要介紹了Android Studio 3.5版本JNI生成SO文件詳解,想了解JNI的同學(xué),可以參考下2021-04-04

