返回顶部
首页 > 资讯 > 移动开发 >androidLauncherAppWidget添加步骤介绍
  • 506
分享到

androidLauncherAppWidget添加步骤介绍

2024-04-02 19:04:59 506人浏览 泡泡鱼
摘要

目录一、AppWidget开机启动加载二、Launcher3启动添加总结一、AppWidget开机启动加载 Android系统启动,SystemServer创建AppWidgetSe

一、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内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: androidLauncherAppWidget添加步骤介绍

本文链接: https://lsjlt.com/news/161845.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • androidLauncherAppWidget添加步骤介绍
    目录一、AppWidget开机启动加载二、Launcher3启动添加总结一、AppWidget开机启动加载 Android系统启动,SystemServer创建AppWidgetSe...
    99+
    2024-04-02
  • 安装mysql5.7.18步骤介绍
    下文主要给大家带来安装mysql5.7.18步骤,希望这些内容能够带给大家实际用处,这也是我编辑安装mysql5.7.18步骤这篇文章的主要目的。好了,废话不多说,大家直接看下文吧。下载linux 源码包 ...
    99+
    2024-04-02
  • 彻底删除MySQL步骤介绍
    目录1、先停止 MySQL Server2、卸载 MySQL Server3、删除 MySQL 文件夹4、删除注册表1、先停止 MySQL Server 步骤:此电脑 ——> ...
    99+
    2024-04-02
  • Mac上安装MySQL的步骤介绍
    本文主要给大家介绍Mac上安装MySQL的步骤,文章内容都是笔者用心摘选和编辑的,具有一定的针对性,对大家的参考意义还是比较大的,下面跟笔者一起了解下Mac上安装MySQL的步骤吧。   ...
    99+
    2024-04-02
  • 详细介绍Git的提交步骤
    随着软件开发和团队协作越来越普及,Git作为分布式版本控制系统,已经成为了几乎所有开发团队的必备工具之一。熟悉Git的基本使用方法,对开发者来说也是一项重要的技能。下面本文将详细介绍Git的提交步骤。Git 提交的基本概念提交是 Git 中...
    99+
    2023-10-22
  • Nginx配置SSL和WSS步骤介绍
    目录前言一.Nginx安装1.下载Nginx2.安装依赖3.编译安装Nginx二.SSL配置三.WSS配置前言 近期,由于要发布微信小程序,小程序的发布必须使用已备案的服务器域名及h...
    99+
    2024-04-02
  • Docker安装MinIO详细步骤介绍
    目录一、查看docker环境是否正常二、下载minIO的镜像三、创建minIO容器四、访问地址五、安装遇到问题1、问题一2、问题二3、问题三一、查看docker环境是否正常 在命令行...
    99+
    2024-04-02
  • docker安装ros2详细步骤介绍
    目录正题一、ubuntu上安装docker二、Docker中安装ROS2-Foxy三、ROS2 docker可视化运行小乌龟最后正题 说一说今天的正题docker和ros2 ,本篇文...
    99+
    2024-04-02
  • IntelliJ IDEA 2017.1.4 x64配置步骤(介绍)
    只是为了研究下idea这款编译器怎么使用。开门见山,说下如何配置这款编译器,不配置也能用,但是强迫症表示不服。下面直入正题:下载与安装就不说了,除了更改安装目录外,没啥注意的地方,建议下载idea去官网下载,这里的“官网”不是下载站哦。安装...
    99+
    2023-05-31
    intellij idea 2017.1.4
  • win7更新win10详细步骤介绍
    许多期待已久的win7用户们不停地等待着,却迟迟未能收到windows系统的推送。想要升级为win10好一把体验一下win10所带来的新功能,那么win7怎么升级为win10呢此教程可帮助您简单、快速将win7升级win10.快来看看吧。1...
    99+
    2023-07-13
  • 添加服务器操作步骤
    第一步:找到相应的账号,看其分配了哪些服务器,如下图所示是个人账号分配的服务器,包括服务器地址、端口号(Port)、服务器类型以及加密方式 第二步:打开V2rayN软件,添加相应的服务器,如下...
    99+
    2023-09-08
    服务器 运维 Powered by 金山文档
  • Java连接数据库的步骤介绍
    第一步:数据库驱动和数据量地址基本信息。 // MySQL 8.0 以下版本 - JDBC 驱动名及数据库 URL static final String JDBC_DRIV...
    99+
    2024-04-02
  • JavaScript对象合并实现步骤介绍
    JavaScript 中有多种方法可以合并对象。 1、使用 Object.assign() 方法: 它可以将一个或多个对象的属性复制到目标对象中。例如: const obj1 = {...
    99+
    2023-01-31
    JavaScript对象合并 JS对象合并
  • nodejs怎么安装?详细步骤介绍
    以下是在Windows上安装Node.js的详细步骤:1. 打开Node.js官方网站(https://nodejs.org)并点击...
    99+
    2023-08-28
    nodejs
  • Python添加命令行参数步骤
    目录前言添加命令行参数的一般步骤命令行参数示例前言 许多任务程序如果为其构造为一个命令行界面,就可以通过接受不同的参数来改变它的工作方式。例如,在爬虫程序中,不同 URL&...
    99+
    2024-04-02
  • Python操作注册表详细步骤介绍
    python操作注册表步骤之1.打开注册表 对注册表进行操作前,必须打开注册表。在Python中,可以使用以下两个函数:RegOpenKey和RegOpenKeyEx。其函数原型分别如下所示。 RegOpenKey(k...
    99+
    2022-06-04
    Python操作注册表
  • mysql安装及配置步骤详细介绍
    本文主要给大家简单讲讲mysql安装及配置步骤,相关专业术语大家可以上网查查或者找一些相关书籍补充一下,这里就不涉猎了,我们就直奔主题吧,希望mysql安装及配置步骤这篇文章可以给大家带来一些实际帮助。My...
    99+
    2024-04-02
  • centos7系统上mysql的安装步骤介绍
    本文主要给大家介绍centos7系统上mysql的安装步骤,文章内容都是笔者用心摘选和编辑的,具有一定的针对性,对大家的参考意义还是比较大的,下面跟笔者一起了解下centos7系统上mysql的安装步骤吧。...
    99+
    2024-04-02
  • 详细介绍PHP支付宝支付步骤
    在如今的电商时代,支付宝无疑是备受消费者欢迎的支付方式之一。如果你是一名 PHP 开发者,可能会需要为自己的网站添加支付宝支付功能。下面将详细介绍 PHP 支付宝支付步骤。注册支付宝账号首先,你必须拥有一个可用的支付宝账户,该账户将用于向你...
    99+
    2023-05-14
  • 关于docker容器部署redis步骤介绍
    目录1 redis配置文件2 docker命令启动3 docker-compose启动1 redis配置文件 官方下载:redis.conf 路径:在容器中,一般可以保存在/etc/...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作