網(wǎng)站首頁 編程語言 正文
一、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í),首頁返回到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ù)庫中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é)
原文鏈接:https://blog.csdn.net/u012743062/article/details/122340099
相關(guān)推薦
- 2022-10-11 TCP/IP協(xié)議類比生活案例
- 2022-08-26 C++超集C++/CLI模塊的基本用法_C 語言
- 2022-10-06 C#中?MessageBox的使用技巧_C 語言
- 2023-11-13 解決Selected processor does not support ARM mode `dm
- 2023-04-19 nginx: [error] CreateFile() “D:\nginx-1.21.6/logs/
- 2022-10-18 filebeat同時(shí)收集錯(cuò)誤日志與普通日志并存詳解_nginx
- 2022-12-21 詳解Golang中Channel的原理和使用技巧_Golang
- 2022-06-25 iOS使用NSURLConnection實(shí)現(xiàn)斷點(diǎn)續(xù)傳下載_IOS
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支