首页 > 其他分享 >uniapp 开发之原生Android插件

uniapp 开发之原生Android插件

时间:2024-04-01 14:33:56浏览次数:29  
标签:uniapp 插件 option title content intent Android

开发须知

在您阅读此文档时,我们假定您已经具备了相应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 控件

//必须添加的依赖
	compileOnly 'androidx.localbroadcastmanager:localbroadcastmanager:1.0.0',
	compileOnly 'androidx.core:core:1.1.0'
	compileOnly 'androidx.fragment:fragment:1.1.0'
	compileOnly 'androidx.appcompat:appcompat:1.1.0'
	compileOnly 'androidx.recyclerview:recyclerview:1.1.0'
	compileOnly 'com.alibaba:fastjson:1.2.83'

	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 类型的参数
public class NotificationModule extends UniModule {
    /**
     * 发送通知
     * @param option
     * @param callback
     */
    @UniJSMethod(uiThread = true)
    public void sendNotice(JSONObject option, UniJSCallback callback){
        if (option==null){
            callback.invoke(PluginResultEntites.fail(-1,"参数不能为空"));
            return;
        }
        if (!option.containsKey("title")){
            callback.invoke(PluginResultEntites.fail(-1,"需要设置title参数(通知title)"));
            return;
        }
        if (TextUtils.isEmpty(option.getString("title"))){
            callback.invoke(PluginResultEntites.fail(-1,"参数title不能为空(通知title)"));
            return;
        }
        if (!option.containsKey("content")){
            callback.invoke(PluginResultEntites.fail(-1,"需要设置content参数(通知content)"));
            return;
        }
        if (TextUtils.isEmpty(option.getString("content"))){
            callback.invoke(PluginResultEntites.fail(-1,"参数content不能为空(通知content)"));
            return;
        }
        int resId = mUniSDKInstance.getContext().getResources().getIdentifier("ic_launcher", "mipmap", mUniSDKInstance.getContext().getPackageName());
        String title = option.getString("title");
        String content = option.getString("content");
        Intent intent = new Intent(mUniSDKInstance.getContext(), NotificationClickReceiver.class);
        intent.putExtra("type",10);
        intent.putExtra("noticeTitle",title);
        intent.putExtra("noticeContent",content);
        intent.putExtra("appID",option.getString("appID"));
        intent.putExtra("noticeExtras",option.containsKey("extras")?option.getString("extras"):"");
//        Intent intent = mUniSDKInstance.getContext().getPackageManager().getLaunchIntentForPackage(mUniSDKInstance.getContext().getPackageName());
        //普通通知栏消息
        NotificationUtils notificationUtils = new NotificationUtils(mUniSDKInstance.getContext(), 0, "13214345353", resId, title, content);
        notificationUtils.notifiedReceive(intent);
        callback.invoke(PluginResultEntites.success());

    }
}

扩展组件 Component

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

下面以TestComponent为例

public class TestText extends UniComponent<TextView>{
    //创建对象
    @Override
    protected TextView initComponentHostView(@NonNull Context context) {
        TextView textView = new TextView(context);
        textView.setTextSize(20);
        textView.setTextColor(Color.BLACK);
        return textView;
    }

    //设置电话号码
    @UniComponentProp(name = "tel")
    public void setTel(String telNumber) {
        getHostView().setText("tel: " + telNumber);
    }
    
    //清空电话号码
    @UniJSMethod
    public void clearTel() {
       getHostView().setText("");
    }

}
  • 注册组之后,你可以在nvue 文件中调用
<template>
	<div>
		<myText ref="telText" tel="12305" style="width:200;height:100" @onTel="onTel" @click="myTextClick"></myText>
	</div>
</template>
<script>
    export default {
        methods: {
			myTextClick(e) {
				this.$refs.telText.clearTel();
			}
        }
    }
</script>

注册插件 

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

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

{
      "plugins": [
        {
          "type": "module",
          "name": "NotificationModule",
          "class": "com.kairison.applet.plugin.eachother.notice.NotificationModule"
        }
      ]
    }

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

const notificationModule = uni.requireNativePlugin('NotificationModule')
	notificationModule.sendNotice({
					title: '测试通知',
                    content: '测试内容',
                    
				}, (res) => {
                    console.log(JSON.stringify(res.data))
				})

标签:uniapp,插件,option,title,content,intent,Android
From: https://blog.csdn.net/karision/article/details/137229913

相关文章

  • vscode 必装插件
    AutoCompleteTag集合了AutoCloseTag和AutoRenameTagAutoCloseTag:自动补全结束标签AutoRenameTag:修改前面的htmltag后面</>里面的也会同步修改只需要装一个插件就能得到之前2个插件的能力CommentTranslate鼠标选中能够直接浮窗翻译.(win系统好像是墙的原因......
  • Android Binder——Java层介绍(三)
    一、简介       对于Android系统,一般是从java层到native层,再到kernel驱动层,形成一个完整的软件架构。Android系统中的BinderIPC通信机制的整体架构也是如此,Java和C++层都定义有同样功能的供应用程序使用的Binder接口。然而Java层中Framework层的......
  • Android+Fragment与Activity之间的信息传递——笔记3
    通过Bundle,Fragment与Activity之间的信息传递protectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);btn2=findViewById(R.id.btn2);btn3=findViewById(R.......
  • Android-Frida环境部署
    前言什么是Android逆向开发?Android逆向开发是指对已发布的Android应用进行分析和破解,以了解应用程序的内部工作原理,获取应用程序的敏感信息,或者修改应用程序的行为。逆向开发可以帮助开发人员了解他人的代码目录安装ADB安装python和Friday模拟器安装Friday-server......
  • HBuilderX插件开发常见问题(通用篇)
    使用hx.window.createWebView创建窗口后,为什么不显示出来?如果创建时候想立即显示出来,可以通过调用hx.window.showView方法来显示出来为什么市场页面上HBuilderX最低兼容版本会渲染成不确定?..这个似乎是官方bug(尚待确认)怎么配置插件的市场链接,像这样市场链接不用配置,从......
  • clion + EmmyLua插件实现Lua的本地调试
    安装好EmmyLua插件后,它会提供两种调试方式:1.使用mobdebug调试2.使用EmmyDebugger调试。mobdebug是用lua写的一个调试模块,基于网络通信(所以依赖luasocket),以字符形式传递调试命令和返回结果。所以使用mobdebug前先需要安装luasocket模块。由于基于网络,所以支持跨机器调试,本机调试......
  • Android 10.0 lowmemorykiller低内存时,禁止某个app被kill掉功能实现
    1.前言在10.0的系统定制化开发中,在对于系统lowmemorykiller低内存的时候,应用保活功能是非常重要的,就是在低内存的情况下禁止某个app被杀掉,所以就需要从lowmemorykiller机制入手,在杀进程的相关流程中进行分析来实现进程避免被杀掉,接下来就来实现这个功能2.lowmemorykiller低......
  • android :java 计算器xml文件
     这个代码显示异常<?xmlversion="1.0"encoding="utf-8"?><GridLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="matc......
  • Android studio制作的mqtt协议通讯app,可用于搭建的meqx服务器,不可连接阿里云
    首先,在app目录下创建一个libs文件夹,导入相应的MQTT的jar包,然后右击jar包拉到最后找到Add...的一个选项,单击就OK了然后就是添加一些权限添加另一个layout的名字activity_main<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="http://schemas.android.......
  • Android 12 第一次运行就报错,Android面试题集锦在这里
    以前加上intent-filter的话,exported就默认是true。Android 12之后开始强制大家声明exported属性**。**例如:<application<activityandroid:name=“.actvitiy.MainActivity”android:exported=“true”<activityandroid:name=“.actvitiy.SchemeActivity”android:e......