Android AppWidgetService分析记录二

本文详细分析了Android系统的AppWidgetService启动过程,从SystemServer启动AppWidgetService,到Launcher与AppWidgetHost的交互。当包被添加时,AppWidgetService会监听并加载Widget提供者,更新Widget信息到appwidgets.xml文件,并通过回调机制通知Launcher更新AppWidgetHostView。AppWidgetHost主要负责处理事件更新和创建真实的Widget视图。
摘要由CSDN通过智能技术生成

AppWidgetService 启动

在SystemServer的main()方法中,调用SystemServer.run()

    /**
     * The main entry point from zygote.
     */
    public static void main(String[] args) {
   
        new SystemServer().run();
    }

在run方法中,初始化系统上下文,启动三个服务,

  • startBootstrapServices()
    该方法所创建的服务:ActivityManagerService, PowerManagerService, LightsService, DisplayManagerService, PackageManagerService, UserManagerService, sensor服务.

  • startCoreServices()
    启动服务BatteryService,UsageStatsService,WebViewUpdateService。

  • startOtherServices()
    启动其他相关服务

在其他服务中启动AppWidgetService

            if (mPackageManager.hasSystemFeature(PackageManager.FEATURE_APP_WIDGETS)
                    || context.getResources().getBoolean(R.bool.config_enableAppWidgetService)) {
   
                t.traceBegin("StartAppWidgetService");
                mSystemServiceManager.startService(APPWIDGET_SERVICE_CLASS);
                t.traceEnd();
            }

最终调用service.start()方法,实现AppWidgetServiceImpl的onStart方法,

public void startService(@NonNull final SystemService service) {
   
        // Register it.
        mServices.add(service);
        // Start it.
        long time = SystemClock.elapsedRealtime();
        try {
   
            service.onStart();
        } catch (RuntimeException ex) {
   
            throw new RuntimeException("Failed to start service " + service.getClass().getName()
                    + ": onStart threw an exception", ex);
        }
        warnIfTooLong(SystemClock.elapsedRealtime() - time, service, "onStart");
    }

AppWidgetServiceImlp 中初始化相关管理器,

public void onStart() {
   
        mPackageManager = AppGlobals.getPackageManager();
        mAlarmManager = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);
        mUserManager = (UserManager) mContext.getSystemService(Context.USER_SERVICE);
        mAppOpsManager = (AppOpsManager) mContext.getSystemService(Context.APP_OPS_SERVICE);
        mKeyguardManager = (KeyguardManager) mContext.getSystemService(KEYGUARD_SERVICE);
        mDevicePolicyManagerInternal = LocalServices.getService(DevicePolicyManagerInternal.class);
        mPackageManagerInternal = LocalServices.getService(PackageManagerInternal.class);
        mSaveStateHandler = BackgroundThread.getHandler();
        mCallbackHandler = new CallbackHandler(mContext.getMainLooper());
        mBackupRestoreController = new BackupRestoreController();
        mSecurityPolicy = new SecurityPolicy();
        
        // 将内存使用限制为显示器大小的1.5倍
        computeMaximumWidgetBitmapMemory();
        // 注册有关软件包安装等的广播,以便我们可以
        // 更新提供者列表。
        registerBroadcastReceiver();
        // 添加是可选组件的设备策略改变监听
        registerOnCrossProfileProvidersChangedListener();

        LocalServices.addService(AppWidgetManagerInternal.class, new AppWidgetManagerLocal());
    }

Launcher

在launcher主界面

@Override
255    protected void onCreate(Bundle savedInstanceState) {
   
272        super.onCreate(savedInstanceState);
           ...
289        mAppWidgetManager = AppWidgetManagerCompat.getInstance(this);

290        // mAppWidgetHost是launcher承载AppWidgetView的宿主
291        mAppWidgetHost = new LauncherAppWidgetHost(this);
292        mAppWidgetHost.startListening();
           
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值