当前位置:   article > 正文

uniapp 开发之原生Android插件_uniapp引入安卓插件

uniapp引入安卓插件

开发须知

在您阅读此文档时,我们假定您已经具备了相应Android应用开发经验,使用Android Studio开发过Android原生。也应该对HTML,JavaScript,CSS等有一定的了解, 并且熟悉在JavaScript和JAVA环境下的JSON格式数据操作等。

为了插件开发者更方便快捷的开发uni原生插件!2.9.8版本起修改了uni插件开发API及规范。当然还会继续兼容老的插件运行及开发。推荐插件开发者按新版规范实现开发插件。方便日后更高效的更新迭代uni原生插件!

开发环境

新建Uni原生插件项目

  • 点击Android Studio菜单选项File--->New--->New Project。

  • 导入Uni SDK 官网下载对应的SDK SDK下载,在自己的libs 下导入自己需要的离线包

  • 开发插件

开发的插件必须导入uniapp-v8-release.aar,创建一个插件的module(本例以通知插件NotificationModule为例),插件开发有两种类型。

1、Module 扩展 非 UI 的特定功能.

2、Component 扩展 实现特别功能的 Native 控件

  1. //必须添加的依赖
  2. compileOnly 'androidx.localbroadcastmanager:localbroadcastmanager:1.0.0',
  3. compileOnly 'androidx.core:core:1.1.0'
  4. compileOnly 'androidx.fragment:fragment:1.1.0'
  5. compileOnly 'androidx.appcompat:appcompat:1.1.0'
  6. compileOnly 'androidx.recyclerview:recyclerview:1.1.0'
  7. compileOnly 'com.alibaba:fastjson:1.2.83'
  8. compileOnly fileTree(include: ['uniapp-v8-release.aar'], dir: '../app/libs')

 创建NotificationModule类

  • Module 扩展必须继承 UniModule 类
  • 扩展方法必须加上@UniJSMethod (uiThread = false or true) 注解。UniApp 会根据注解来判断当前方法是否要运行在 UI 线程,和当前方法是否是扩展方法。
  • UniApp是根据反射来进行调用 Module 扩展方法,所以Module中的扩展方法必须是 public 类型。
  • 同样因为是通过反射调用,Module 不能被混淆。请在混淆文件中添加代码:
  • -keep public class * extends io.dcloud.feature.uniapp.common.UniModule{*;}
    
  • Module 扩展的方法可以使用 int, double, float, String, Map, List ,com.alibaba.fastjson.JSONObject 类型的参数
  1. public class NotificationModule extends UniModule {
  2. /**
  3. * 发送通知
  4. * @param option
  5. * @param callback
  6. */
  7. @UniJSMethod(uiThread = true)
  8. public void sendNotice(JSONObject option, UniJSCallback callback){
  9. if (option==null){
  10. callback.invoke(PluginResultEntites.fail(-1,"参数不能为空"));
  11. return;
  12. }
  13. if (!option.containsKey("title")){
  14. callback.invoke(PluginResultEntites.fail(-1,"需要设置title参数(通知title)"));
  15. return;
  16. }
  17. if (TextUtils.isEmpty(option.getString("title"))){
  18. callback.invoke(PluginResultEntites.fail(-1,"参数title不能为空(通知title)"));
  19. return;
  20. }
  21. if (!option.containsKey("content")){
  22. callback.invoke(PluginResultEntites.fail(-1,"需要设置content参数(通知content)"));
  23. return;
  24. }
  25. if (TextUtils.isEmpty(option.getString("content"))){
  26. callback.invoke(PluginResultEntites.fail(-1,"参数content不能为空(通知content)"));
  27. return;
  28. }
  29. int resId = mUniSDKInstance.getContext().getResources().getIdentifier("ic_launcher", "mipmap", mUniSDKInstance.getContext().getPackageName());
  30. String title = option.getString("title");
  31. String content = option.getString("content");
  32. Intent intent = new Intent(mUniSDKInstance.getContext(), NotificationClickReceiver.class);
  33. intent.putExtra("type",10);
  34. intent.putExtra("noticeTitle",title);
  35. intent.putExtra("noticeContent",content);
  36. intent.putExtra("appID",option.getString("appID"));
  37. intent.putExtra("noticeExtras",option.containsKey("extras")?option.getString("extras"):"");
  38. // Intent intent = mUniSDKInstance.getContext().getPackageManager().getLaunchIntentForPackage(mUniSDKInstance.getContext().getPackageName());
  39. //普通通知栏消息
  40. NotificationUtils notificationUtils = new NotificationUtils(mUniSDKInstance.getContext(), 0, "13214345353", resId, title, content);
  41. notificationUtils.notifiedReceive(intent);
  42. callback.invoke(PluginResultEntites.success());
  43. }
  44. }

扩展组件 Component

  • Component 扩展 实现特别功能的 Native 控件
  • Component 不支持代码中 new Component 创建对象。无法正常使用!

下面以TestComponent为例

  1. public class TestText extends UniComponent<TextView>{
  2. //创建对象
  3. @Override
  4. protected TextView initComponentHostView(@NonNull Context context) {
  5. TextView textView = new TextView(context);
  6. textView.setTextSize(20);
  7. textView.setTextColor(Color.BLACK);
  8. return textView;
  9. }
  10. //设置电话号码
  11. @UniComponentProp(name = "tel")
  12. public void setTel(String telNumber) {
  13. getHostView().setText("tel: " + telNumber);
  14. }
  15. //清空电话号码
  16. @UniJSMethod
  17. public void clearTel() {
  18. getHostView().setText("");
  19. }
  20. }
  • 注册组之后,你可以在nvue 文件中调用
  1. <template>
  2. <div>
  3. <myText ref="telText" tel="12305" style="width:200;height:100" @onTel="onTel" @click="myTextClick"></myText>
  4. </div>
  5. </template>
  6. <script>
  7. export default {
  8. methods: {
  9. myTextClick(e) {
  10. this.$refs.telText.clearTel();
  11. }
  12. }
  13. }
  14. </script>

注册插件 

主要介绍json的方式注册新创建的插件,现在新建截图的文件,在主项目的app asset目录下创建。

在dcloud_uniplugins.json中注册新建的插件

  1. {
  2. "plugins": [
  3. {
  4. "type": "module",
  5. "name": "NotificationModule",
  6. "class": "com.kairison.applet.plugin.eachother.notice.NotificationModule"
  7. }
  8. ]
  9. }

 在uni-app项目中获取插件,通过requireNativePlugin 来获取插件,本例子以NotificationModule

  1. const notificationModule = uni.requireNativePlugin('NotificationModule')
  2. notificationModule.sendNotice({
  3. title: '测试通知',
  4. content: '测试内容',
  5. }, (res) => {
  6. console.log(JSON.stringify(res.data))
  7. })
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/617845
推荐阅读
相关标签
  

闽ICP备14008679号