uniapp实现桌面小部件功能(安卓)开发日志

独立开发一开始选择了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属性实际上并不总是直接显示在小组件上;它更多地是用于在添加小组件时的列表或设置中标识小组件。

  • 12
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值