独立开发一开始选择了uniapp ,但是遇到了这样的需求,就是桌面小部件功能。这个功能我一开始觉得没啥作用,自己用了一下感觉还是挺不错的。所以也想实现一下。但是网上的教程少之又少。基本上翻遍了都没有一个手把手实现的。只能靠自己摸索了。对于没有接触过安卓原生开发的人来说真的很不友好。

研究了一段时间,有两种方式实现桌面小部件
1.是用uniapp的uts语言。
2.就是使用安卓原生插件。
第一种方式虽然方便但是每次调试都打自定义基座感觉太费时间。
第二种方式就是引入安卓的aar插件 这样的话就可以小部件和uniapp分开进行设计了。

设计思路:
1.先按照uniapp Android原生插件开发和离线打包调试的步骤制作aar包
2.安卓studio上创建桌面小部件,然后生成aar文件
3.uniapp导入上面的aar插件然后打自定义调试基座 即可实现简单的小部件
4.实现数据交互 监听事件,然后小部件使用SharedPreferences保存数据。uniapp通过 @UniJSMethod调用插件中的方法来获取SharedPreferences保存的数据然后返回给uniapp内部。uniapp给小部件传数据也是调用安卓插件的方法传json然后进行解析。
5.实现点击小部件打开app功能目前使用Intent的方式。
6.因为小部件和uniapp的数据是分开的,还需要进行数据同步,进入uniapp页面会触发同步。

问题记录:
1.当前运行的基座不包含原生插件[xxx],请在manifest中配置该插件,重新制作包括该原生插件的自定义运行基座.检查aar插件的package.json中的class路径是否正确。这个容易出错。

疑问:
1.数据同步这块感觉还是比较麻烦,和原生开发比起来多了一步数据同步,要是能省去这一步就方便了。
2.如何在uniapp中直接唤起桌面小部件,目前还没实现。
3.uniapp的ios桌面小部件怎么做。这个还需要研究一下。

目前做了一个demo走了一下流程是ok的,本文粗略介绍了一下思路,并做一下笔记。后续会补充详细的代码。因为没有教程,uniapp桌面小部件这块折腾了好久。希望能帮助到需要的人,欢迎交流~

2024-06-24日志
实现了一下点击桌面小组件打开本app的功能。这块走了不少弯路使用了。一开始使用小组件跳转到目标活动类然后触发跳转app反正是不行,具体原因也不得而知。后来在小部件的onUpdate事件中加入跳转就可以了。嘿嘿。代码如下:

       // 创建用于启动活动的PendingIntent(如果需要的话,应该指向一个具体的Activity)
            Intent launchIntent = context.getPackageManager().getLaunchIntentForPackage(context.getPackageName());
            PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, launchIntent, PendingIntent.FLAG_IMMUTABLE);
            views.setOnClickPendingIntent(R.id.jump_to_app_button, pendingIntent);

接下来实现uniapp内添加小部件功能,应该也简单。

2024-06-25日志 实现安卓原生内部弹框添加桌面小部件
人麻了 对于没接触过安卓原生开发的人 真的是上强度看着简单的功能足足用了我5个小时才搞定。
实现uniapp内添加小部件功能。主要就是没有那么全面的教程,只能摸着石头过河。
安卓原生内部弹框添加桌面小部件只需要下面代码即可实现

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            AppWidgetManager mAppWidgetManager =   context.getSystemService(AppWidgetManager.class);
            ComponentName myProvider = new ComponentName(context, MyWidgetProvider.class);
            Bundle b = new Bundle();
            b.putString("嘿嘿嘿", "嘿嘿嘿");
            if (mAppWidgetManager.isRequestPinAppWidgetSupported()) {
                Intent pinnedWidgetCallbackIntent = new Intent(context,MyWidgetProvider.class);
                PendingIntent successCallback = PendingIntent.getBroadcast(context, 0,
                        pinnedWidgetCallbackIntent, 0);
                mAppWidgetManager.requestPinAppWidget(myProvider, b, successCallback);
            }
        }

下一步计划做一个完整的小部件。实现闭环。基本上核心的问题都解决了。uniapp开发安卓小部件也不是问题了。

2024-07-03日志 实现RemoteViewsService以及同一个类型的多个小部件展现不同内容。
需要定义一个private Map<Integer, List> widgetIdToDataListMap = new HashMap<>();
RemoteViewsService每次都传入appWidgetId 根据appWidgetId来更新对应的小部件的数据。

          public MyRemoteViewsFactory(Context context, int appWidgetId) {
              this.appWidgetId = appWidgetId;
              this.context = context;
          }

2024-07-04日志 实现小组件的命名
在AndroidManifest.xml中注册小组件:然后,在你的AndroidManifest.xml文件中,通过标签注册你的AppWidgetProvider,并使用标签来指定小组件的配置信息,包括它的名称。

<receiver android:name=".ExampleAppWidgetProvider"  
    android:label="@string/appwidget_name"> <!-- 这里设置小组件的名称 -->  
    <intent-filter>  
        <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />  
    </intent-filter>  
 
    <!-- App Widget metadata -->  
    <meta-data  
        android:name="android.appwidget.provider"  
        android:resource="@xml/example_appwidget_info" />  
</receiver>

注意:上面的标签中的android:label属性设置了小组件在设备上的默认名称。但是,请注意,这个android:label属性实际上并不总是直接显示在小组件上;它更多地是用于在添加小组件时的列表或设置中标识小组件。

2024-07-08日志 实现点击桌面小部件 然后跳转uniapp指定页面的功能
因为是混合开发 所以不能向安卓原生那样直接跳转页面。只能是跳转至uniapp内部然后根据传参再进行跳转。app.vue文件的onshow()中调用原生插件中的方法检查传参。因为页面只跳转一次,所以在跳转之后清除原生插件中所保存的参数。

		onShow: function() {
			testMoudel.initScan((ret) => {
				uni.showToast({
					title: ret,
					icon: 'none',
					duration: 2000
				});
				if (ret) {
					uni.setStorageSync('RedirectPath', ret);
					//同时清除记录
					testMoudel.clear_pass()
				}
			})
		},

然后在首页中加入一个循环事件。判断RedirectPath是否有参数,有的话根据参数进行页面跳转即可。当应用未启动时,可以在首页beforeMount方法中也加入跳转。

2024-07-09日志 创建小部件后设置小部件具体参数的功能 用于不同小部件显示不同内容
1.创建ExampleAppWidgetConfigure类
2.在AndroidManifest.xml中注册Activity
3.小部件appwidget-provider 文件中配置android:configure=“com.example.Scanqrmodule.ExampleAppWidgetConfigure”

<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    android:configure="com.example.Scanqrmodule.ExampleAppWidgetConfigure"
    android:initialKeyguardLayout="@layout/my_remote_widget"
    android:initialLayout="@layout/my_remote_widget"
    android:minHeight="100dp"
    android:minWidth="150dp"
    android:previewImage="@drawable/mubiao"
    android:resizeMode="horizontal|vertical"
    android:updatePeriodMillis="86400000"
    android:widgetCategory="home_screen|keyguard">
</appwidget-provider>

基本上想实现的功能都实现了,后续会把完整的demo上传至gitee中

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐