android Launcher AppWidget添加步骤介绍

 更新时间:2022年01月07日 10:44:12   作者:空间维度  
大家好,本篇文章主要讲的是android Launcher AppWidget添加步骤介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览

一、AppWidget开机启动加载

Android系统启动,SystemServer创建AppWidgetService,并调用AppWidgetServiceImpl.onStart()方法,初始化相关管理器,注册四个广播接收器:

第一、注册有关软件包安装、删除、改变的广播,以便我们可以更新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);
第二、当锁定状态发生变化时会播放一些事件:
        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);
第三、暂停或解除暂停应用广播;
        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);
第四、注册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启动添加

Launcher启动onCreate()方法初始化mAppWidgetManager, mAppWidgetHost对象,AppWidgetHost是launcher承载AppWidgetView的宿主
mAppWidgetHost.startListening,通过

public void onCreate() {
    ...
    // 13      //得到AppWidget管理实例 : AppWidgetManager , AppWidgetHost , AppWidgetHostView三个类的关系

    mAppWidgetManager = AppWidgetManagerCompat.getInstance(this);

    mAppWidgetHost = new LauncherAppWidgetHost(this);
    // Host启动监听,监听LauncherProvider中的数据改变
    mAppWidgetHost.startListening();
    ...
}
1、初始化AppWidgetHostd对象,创建用于回调的Callbacks服务类IAppWidgetHost.Stub, 绑定服务bindService,得到IAppWidgetService对象,进行launcher和AppWidgetService之间的调用
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信息保存到系统服务成员变量中,
3、当添加AppWidget时,首页返回到Launcher中的onActivityResult中,在handleActivityResult中
        addAppWidgetImpl(
                        appWidgetId, requestArgs, null,
                        requestArgs.getWidgetHandler(),
                        ON_ACTIVITY_RESULT_ANIMATION_DELAY);
创建添加小部件意图,之后返回到onActivityForResult,调用completeAddAppWidget,通过IAppWidgetService.getAppWidgetInfo,获取AppWidgetProviderInfo,保存到本地数据库中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);
// 计算AppWidget的显示大小位置
1098        item.onBindAppWidget(this, hostView);
1099        hostView.setFocusable(true);
1100        hostView.setOnFocusChangeListener(mFocusHandler);
1101    }
并创建AppWidgetHostView 对象,mAppWidgetHost.createView,返回RemoteView对象,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;
    }
调用AppWidgetHostView.updateAppWidget(views);更新View到launcher界面上mWorkspace.addInScreen(hostView, launcherInfo);

当AppWidgetProvider获得更新的广播,并执行onUpdate(),onUpdate()中创建了RemoteViews并通过AppWidgetManager.updateAppWidget()更新到AppWidgetService之后,AppWidgetService会通过注册的IAppWidgetHost的回调,执行AppWidgetHost的更新。

总结

到此这篇关于android Launcher AppWidget添加步骤介绍的文章就介绍到这了,更多相关android Launcher AppWidget内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 使用Flutter开发一个图片UI组件的代码示例

    使用Flutter开发一个图片UI组件的代码示例

    在移动应用开发中,图片展示是一个常见的需求,为了满足不同场景的图片展示需求,我们可以开发一个灵活配置的图片UI组件,本文将介绍如何使用Flutter开发一个图片UI组件,并提供了丰富的配置选项,需要的朋友可以参考下
    2023-09-09
  • Android开发服务Service全面讲解

    Android开发服务Service全面讲解

    Android的服务是开发Android应用程序的重要组成部分。不同于活动Activity,服务是在后台运行,服务没有接口,生命周期也与活动Activity非常不同。通过使用服务我们可以实现一些后台操作,比如想从远程服务器加载一个网页等,下面来看看详细内容,需要的朋友可以参考下
    2023-02-02
  • Android实现环形进度条代码

    Android实现环形进度条代码

    这篇文章主要为大家详细介绍了Android实现环形进度条的代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-01-01
  • Android选择与上传图片之PictureSelector教程

    Android选择与上传图片之PictureSelector教程

    这篇文章主要介绍了在Android中对于图片的选择与上传方法,本文介绍了PictureSelector的相关使用教程,学习Android的同学进来看看吧
    2021-08-08
  • Android入门之ViewFlipper翻转视图的使用详解

    Android入门之ViewFlipper翻转视图的使用详解

    本篇给大家带了的是ViewFlipper,它是Android自带的一个多页面管理控件,且可以自动播放!本篇我们我们会使用两个例子:一个自动播放首页轮播页一个手动可左右滑动道页的轮播页来说透这个组件的使用,感兴趣的可以了解一下
    2022-11-11
  • Kotlin编写Android适配器Adapter

    Kotlin编写Android适配器Adapter

    这篇文章主要为大家详细介绍了Kotlin编写Android适配器Adapter的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • Android Studio Kotlin代码和java代码相互转化实例

    Android Studio Kotlin代码和java代码相互转化实例

    这篇文章主要介绍了Android Studio Kotlin代码和java代码相互转化实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-03-03
  • 一文彻底了解Android中的线程和线程池

    一文彻底了解Android中的线程和线程池

    众所周知线程池能很高地提升程序的性能,下面这篇文章主要给大家介绍了关于Android中线程和线程池的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2022-12-12
  • android 为应用程序创建桌面快捷方式技巧分享

    android 为应用程序创建桌面快捷方式技巧分享

    手机装的软件过多,找起来很不方便,所以在主页面有一个快捷方式的话会很不错的,本文将介绍如何实现,需要了解跟多的朋友可以参考下
    2012-12-12
  • Android Studio 3.5版本JNI生成SO文件详解

    Android Studio 3.5版本JNI生成SO文件详解

    这篇文章主要介绍了Android Studio 3.5版本JNI生成SO文件详解,想了解JNI的同学,可以参考下
    2021-04-04

最新评论