android 车载widget小部件部分详细源码实战开发-千里马车载车机framework开发实战课程

这篇具有很好参考价值的文章主要介绍了android 车载widget小部件部分详细源码实战开发-千里马车载车机framework开发实战课程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

官网参考链接:https://developer.android.google.cn/develop/ui/views/appwidgets/overview

1、什么是小部件

App widgets are miniature application views that can be embedded in other applications (such as the home screen) and receive periodic updates。
通俗解释:一个能够定期刷新并且加到其他应用上的微型视图。
更多android framework干货内容请找千里马私聊:https://www.bilibili.com/video/BV1wj411o7A9/

2、小部件的运行机制是什么?

android 车载widget小部件部分详细源码实战开发-千里马车载车机framework开发实战课程,车载桌面,android,framework,车载,车机,手机开发,系统开发,widget通过 AppWidgetProvider 定义小部件的行为
通过 RemoteView 和布局文件定义小部件的UI
通过AppWidgetManager 更新视图
在manifeset 里注册 AppWidgetProvider(继承于广播),设置监听的action

3、小部件运行在什么进程?

首先明白一下Host进程和widget进程,看如下图所示:
android 车载widget小部件部分详细源码实战开发-千里马车载车机framework开发实战课程,车载桌面,android,framework,车载,车机,手机开发,系统开发,widget
小部件运行波及的进程,及各个进程的责任:
android 车载widget小部件部分详细源码实战开发-千里马车载车机framework开发实战课程,车载桌面,android,framework,车载,车机,手机开发,系统开发,widget

小部件的运行逻辑需要分为三部分:AppWidgetProvider 中的逻辑运行在小部件所在应用进程。小部件的数据存储,权限校验的逻辑,widget进程和host进程的沟通桥梁即跨进程通讯中介,运行在system_process中。小部件渲染逻辑在host 进程中。

4、RemoteView如何工作?

RemoteView 继承于Parcelable,可在进程间传递。RemoteView 会将每一个设置的行为转换成相应的Action。在Host 侧进程时再将Action 翻译成对应的行为。

如:
正常自己进程
TextView 的setText方法,直接调mTextView.setText就行
但是这个widget都不是自己widget进程进行的渲染,这里就只能通过RemoteView方式来操作,RemoteView的原理其实就是,传递类是一个方法名字字符,因为字符串是可以跨进程传递的,然后到达了Host进程,Host进程可以根据方法名字的字符串进行反射调用
原理图如下:
android 车载widget小部件部分详细源码实战开发-千里马车载车机framework开发实战课程,车载桌面,android,framework,车载,车机,手机开发,系统开发,widget

可以看出RemoteViews本质就是个可以进行跨进程控制显示view的媒介,没有像控制自己view那么的方便,对应view的控制接口都需要一一转化,所以还是很不灵活,而且这里注意了,因为view种类可能很多,但是remoteviews就只有固定一些,不支持随意各种view或者自定义
android 车载widget小部件部分详细源码实战开发-千里马车载车机framework开发实战课程,车载桌面,android,framework,车载,车机,手机开发,系统开发,widget

5、widget开发部分

AppWidgetProviderInfo object 
Describes the metadata for an App Widget, such as the App Widget's layout, update frequency, and the AppWidgetProvider class. This should be defined in XML.
AppWidgetProvider class implementation
Defines the basic methods that allow you to programmatically interface with the App Widget, based on broadcast events. Through it, you will receive broadcasts when the App Widget is updated, enabled, disabled and deleted.

1 准备好AppWidgetProviderInfo信息
AppWidgetProviderInfo 主要来描述Widget的元数据,比如widget的layout,更新频率,一般在xml中进行定义

<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    android:minWidth="60dp"
    android:minHeight="30dp"
    android:updatePeriodMillis="86400000"
    android:initialLayout="@layout/appwidget_provider"
    android:configure="com.example.android.apis.appwidget.ExampleAppWidgetConfigure"
    android:resizeMode="horizontal"
    >
</appwidget-provider>

最关键的是initialLayout会有初始化布局,即widget默认显示布局,即widget程序如果还没有调用代码的updateWidget前显示的默认布局

layout/appwidget_provider

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/appwidget_text"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="#ffff00ff"
    android:textColor="#ff000000"
/>

2 准备好AppWidgetProvider实现类
AppWidgetProvider的实现类
以广播为基础,回调通知AppWidget情况,比如更新,enable,disabled等通知

public class ExampleAppWidgetProvider extends AppWidgetProvider {

    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
        //省略
    }
    //省略
}

3 在manifest中进行注册

     <receiver android:name=".appwidget.ExampleAppWidgetProvider">
            <meta-data android:name="android.appwidget.provider"
                    android:resource="@xml/appwidget_provider" />
            <intent-filter>
                <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
            </intent-filter>
        </receiver>

meta-data标签也非常重要,它就是链接上了AppWidgetProviderInfo的xml

4 widget的ui通过代码更新方式

  static void updateAppWidget(Context context, AppWidgetManager appWidgetManager,
            int appWidgetId, String titlePrefix) {

        RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.appwidget_provider);
        views.setTextViewText(R.id.appwidget_text, text);

        // Tell the widget manager
        appWidgetManager.updateAppWidget(appWidgetId, views);
    }

主要通过布局构建出对应的RemoteViews,然后对布局中的具体View进行相关set操作,最后调用appWidgetManager的updateAppWidget方法进行更新AppWidget

相关demo地址,需要下载aosp源码:
aosp/development/samples/ApiDemos/src/com/example/android/apis/appwidget/

widget展示在手机桌面的widget页面,因为前面的widget的manifest配置了,所以桌面才可以扫描展示出来:
android 车载widget小部件部分详细源码实战开发-千里马车载车机framework开发实战课程,车载桌面,android,framework,车载,车机,手机开发,系统开发,widget
拖动到桌面成功后widget显示如下:
android 车载widget小部件部分详细源码实战开发-千里马车载车机framework开发实战课程,车载桌面,android,framework,车载,车机,手机开发,系统开发,widget

6、Widget的显示Host进程详解

在aosp的CarLauncher中其实本身功能代码属于很简单,没有相关appwidget显示的需求点,但是是手机桌面是有完整的作为widgethost的代码部分。所以了解清除怎么作为一个WidgetHost就变得非常关键了。

需要

App widget host: The AppWidgetHost provides the interaction with the AppWidget service for apps that want to embed app widgets in their UI. An AppWidgetHost must have an ID that is unique within the host's own package. This ID remains persistent across all uses of the host. The ID is typically a hard-coded value that you assign in your application.

App widget ID: Each widget instance is assigned a unique ID at the time of binding (see bindAppWidgetIdIfAllowed(), covered in more detail in Binding widgets on this page. The unique ID is obtained by the host using allocateAppWidgetId(). This ID is persistent across the lifetime of the widget, that is, until it is deleted from the host. Any host-specific state (such as the size and location of the widget) should be persisted by the hosting package and associated with the app widget ID.

App widget host view: Think of AppWidgetHostView as a frame that the widget is wrapped in whenever it needs to be displayed. A widget is associated with an AppWidgetHostView every time the widget is inflated by the host. Note the following points:

By default, the system will create an AppWidgetHostView, but the host can create its own subclass of AppWidgetHostView by extending it.
Starting in Android 12 (API level 31), AppWidgetHostView introduces the the setColorResources() and resetColorResources() methods for handling dynamically overloaded colors. The host is responsible for providing the colors to these methods.

AppWidgetHost 负责和系统systemserver的AppWidget service进行相关的交互,每个AppWidgetHost需要有独立的id,也就意味者其实不仅仅只有桌面可以作为host,只是我们平常最常见是桌面,也代表可以有多个host同时显示widget
android 车载widget小部件部分详细源码实战开发-千里马车载车机framework开发实战课程,车载桌面,android,framework,车载,车机,手机开发,系统开发,widget

App widget ID代表每个App Widget实例都会有个独立的id,通过AppWidgetHost的allocateAppWidgetId的方法来获取,主要是在对widget进行binding时候需要这个id,就是bindAppWidgetIdIfAllowed方法需要这个id。

AppWidgetHostView
作为渲染widget的view,负责inflate widget的相关view

需要权限
BIND_APPWIDGET权限级别如下:
android 车载widget小部件部分详细源码实战开发-千里马车载车机framework开发实战课程,车载桌面,android,framework,车载,车机,手机开发,系统开发,widget需要有platform签名,或者属于内置priv/app才可以,这点其实CarLauncher一般都是满足的,一般都是platform签名和系统一样。

具体实战分析(参考aosp的源码demo:development/apps/WidgetPreview/src/com/android/widgetpreview/WidgetPreviewActivity.java):

  第一步,根据独特HOST_ID,构造出AppWidgetHost :
  mAppWidgetHost = new AppWidgetHost(getApplicationContext(), APPWIDGET_HOST_ID);
  第二步,AppWidgetHost 申请出独特的widget id:
  int id = mAppWidgetHost.allocateAppWidgetId();
  第三步,用申请的widget id绑定到对应的widget的provider的componentName:
  mAppWidgetManager.bindAppWidgetId(mAppWidgetId, intent.getComponent(), options);
  第四步,获取providerInfo,创建对应的AppWidgetHostView,进行add:
	 AppWidgetProviderInfo providerInfo =
            AppWidgetManager.getInstance(getBaseContext()).getAppWidgetInfo(appWidgetId);
mAppWidgetView = mAppWidgetHost.createView(getBaseContext(), appWidgetId, providerInfo);
mAppWidgetFrame.addView(mAppWidgetView, mPreviewWidth, mPreviewHeight);

android 车载widget小部件部分详细源码实战开发-千里马车载车机framework开发实战课程,车载桌面,android,framework,车载,车机,手机开发,系统开发,widget现象演示:
android 车载widget小部件部分详细源码实战开发-千里马车载车机framework开发实战课程,车载桌面,android,framework,车载,车机,手机开发,系统开发,widget文章来源地址https://www.toymoban.com/news/detail-707708.html

到了这里,关于android 车载widget小部件部分详细源码实战开发-千里马车载车机framework开发实战课程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android App开发实战之实现微信记账本(附源码 超详细必看)

    需要源码或图片集请点赞关注收藏后评论区留言~~~ 好用的记账本必须具备两项基本功能。一项时记录新帐单,另一项时查看账单列表,其中账单的记录操作要求用户输入账单的明细要素,包括账单的发生时间,账单的收支类型,账单的交易金额,账单的事由描述等等,账单通

    2024年02月03日
    浏览(30)
  • 第二节-安卓多屏双屏实战车载车机智能驾驶舱开发/千里马android framwork开发

    hi,粉丝朋友们! 上一节已经对车载的多屏互动进行了相关的技术方案介绍,以及相关的核心方法 moveRootTaskToDisplay的讲解和使用。 具体可以参考链接:https://blog.csdn.net/learnframework/article/details/130461689 本节就来进行代码实战 要实现双屏互动,主要就只需要两个步骤: 1、手指动

    2024年02月09日
    浏览(36)
  • Android车载应用系统开发入门教程(非常详细)从零基础入门到精通,看完这一篇就够了

    众所周知,国内的安卓市场内卷极其严重,原生应用开发可谓是寸步难行,但整个Android生态却无比繁荣,手机、平板、电视、音视频等等,特别是在智能汽车+电动汽车的浪潮下,车载行业成为许多Android人竞相奔走的行业, 薪资待遇以及岗位招聘呈上涨趋势 。 对于涉事多年

    2024年02月09日
    浏览(46)
  • Android Studio App开发之网络通信中使用GET方式调用HTTP接口的讲解及实战(附源码 超详细必看)

    运行有问题或需要源码请点赞关注收藏后评论区留言~~~ Android开发采用Java作为编程语言,也就沿用了Java的HTTP连接工具HttpURLConnection,不管是访问HTTP接口还是上传或下载文件都是用它来实现。它有几个关键点 1:HttpURLConnection默认采取国际通行的UTF-8编码,中文用GBK编码 2:多数

    2024年02月05日
    浏览(100)
  • PySide6 Widgets基本小部件类--QWidget

    没有父小部件的小部件始终是一个独立的窗口(顶级小部件)。对于这些小部件,setWindowTitle() 和 setWindowIcon() 分别设置标题栏和图标。

    2024年02月04日
    浏览(42)
  • 智能小程序小部件(Widget)表单组件属性说明+代码明细

    在 Tuya MiniApp Tools 中,新建项目并选择小部件(Widget)对应模板即可自动创建小部件(Widget)项目。 按钮,用于强调操作并引导用户去点击。 属性说明 属性名 类型 默认值 必填 说明 size string default 否 按钮的大小 type string default 否 按钮的样式类型 plain boolean false 否 是否镂空 disa

    2024年01月17日
    浏览(32)
  • 智能小程序小部件(Widget)媒体组件属性说明和示例代码汇总

    基础库 2.2.0 开始支持, 低版本需做兼容处理。 系统相机。相关 API:ty.createCameraContext。这是基于异层渲染的原生组件, 请注意原生组件使用限制。 属性说明 属性名 类型 默认值 必填 说明 mode string normal 否 应用模式,只在初始化时有效,不能动态变更 resolution string medium 否 分

    2024年01月17日
    浏览(26)
  • 智能小程序小部件(Widget)导航、地图、画布等组件,以及开放能力、原生组件说明

    智能小程序小部件(Widget)导航、地图、画布等组件,以及开放能力、原生组件说明。 页面链接,控制小程序的跳转。navigator 子节点的背景色应为透明色。 属性说明 属性名 类型 默认值 必填 说明 url string 是 跳转地址 delta number 1 否 当 open-type 为 \\\'navigateBack\\\' 时有效,表示回退的

    2024年01月17日
    浏览(39)
  • Android 车载应用开发之车载操作系统

    到 2030 年,全球电动汽车的销量将超过 7000 万辆,保有量将达到 3.8 亿辆,全球年度新车渗透率有望触及 60% 。这一数据来自国际能源署(IEA)发布的《全球电动汽车展望2023》。 市场趋势和政策努力的双加持下,新能源汽车来势凶猛,燃油车保有量逐年递减。此番景象让死去

    2024年02月22日
    浏览(41)
  • flutter开发实战-父子Widget组件调用方法

    flutter开发实战-父子Widget组件调用方法 在最近开发中遇到了需要父组件调用子组件方法,子组件调用父组件的方法。这里记录一下方案。 父组件使用globalKey.currentState调用子组件具体方法,子组件通过方法回调callback方法调用父组件的方法。 例如示例中的 例如父组件 父组件使

    2024年02月15日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包