zl程序教程

您现在的位置是:首页 >  其他

当前栏目

Uniapp、Html5plus、Native.js开发记录

2023-03-07 09:43:28 时间

Native.js记录

1. plus.runtimeMainActivity,

获取应用主Activity实例对象,什么是Activity (活动)?

Android的四大组件之一的Activity(活动):Activity是一个应用程序的组件,他在屏幕上提供了一个区域,允许用户在上面做一些交互性的操作, 比如打电话,照相,发送邮件,或者显示一个地图!Activity可以理解成一个绘制用户界面的窗口, 而这个窗口可以填满整个屏幕,也可能比屏幕小或者浮动在其他窗口的上方!

作用:

  1. Activity用于显示用户界面,用户通过Activity交互完成相关操作
  2.  一个App允许有多个Activity。

安卓四大组件:ActivityServiceBroadcastReceiverContentProvider

相关文档:https://www.runoob.com/w3cnote/android-tutorial-activity.html

2.android.content.Context类

Context 按照英文字面意思就是"上下文",它位于位于framework package的android.content.Context中,其实该类为LONG型,类似于句柄。

很多方法需要通过 Context才能识别调用者的实例。

那Context到底是什么呢?

一个Activity就是一个Context,一个Service也是一个Context。

Android程序员把“场景”抽象为Context类,他们认为用户和操作系统的每一次交互都是一个场景.

比如打电话、发短信,这些都是一个有界面的场景.还有一些没有界面的场景,比如后台运行的服务(Service)。

一个应用程序可以认为是一个工作环境,用户在这个环境中会切换到不同的场景,这就像一个前台秘书,她可能需要接待客人,可能要打印文件,还可能要接听客户电话,而这些就称之为不同的场景,前台秘书可以称之为一个应用程序。

相关文章:https://www.jianshu.com/p/4baf231e7084https://mp.weixin.qq.com/s?__biz=MzI0MjE3OTYwMg

3.TelephonyManager (电话管理器)

TelephonyManager,见名知义:用于管理手机通话状态,获取电话信息(设备信息、sim卡信息以及 网络信息),侦听电话状态(呼叫状态服务状态、信号强度状态等)以及可以调用电话拨号器拨打电话!

4.四大组件间的 枢纽——Intent(意图),Android通信的桥梁

相关文档:https://www.runoob.com/w3cnote/android-tutorial-intent-base.html

Native.js 入门指南

官方入门指南:https://ask.dcloud.net.cn/article/88

使用Native.js 的过程中,也需要和Java一样先声明引入一个类,才能使用这个类,在Native.js中使用importClass方法去引入一个类

/* Android平台导入Intent类  */
var Intent = plus.android.importClass("android.content.Intent");  
/* 创建Intent的实例对象 */
var intent = new Intent();

获取实例对象后,可以通过实例对象“.”操作符获取对象的常量属性、调用对象的成员方法,实例对象的非常量属性则需通过plusGetAttribute、plusSetAttribute方法操作。

plus.android.newObject

用于不导入类,直接创建一个实例对象,相比导入类对象后使用new操作符创建对象效率要高。

Native.js代码记录

APP从后台移动到前台,相关代码。需要配置权限:REORDER_TASKS(官方是这么说的,但是这个权限好像没啥用)

/*引入ActivityManager对象*/
plus.android.importClass("android.app.ActivityManager");
/*获取上下文*/
let Context = plus.android.importClass("android.content.Context");
/*获取ActivityManager对象*/
let am = plus.android.runtimeMainActivity().getSystemService(Context.ACTIVITY_SERVICE);
/*获取应有的Activity对象*/
let main = plus.android.runtimeMainActivity();
/*获取正在运行的task*/
let a = am.getRunningTasks(3);
/*获取应用的task,并移动到最前面*/
am.moveTaskToFront(main.getTaskId(), 0);

主要是要声明这个权限android.permission.SYSTEM_ALERT_WINDOW,应用激活时是作为弹窗出现的。不声明这个权限,在设置列表是看不到这个应用的。

获取悬浮窗权限,让应用可以从后台弹出到前台。

let main = plus.android.runtimeMainActivity()
let pkName = main.getPackageName()
let Settings = plus.android.importClass('android.provider.Settings')
let Uri = plus.android.importClass('android.net.Uri')
let Intent = plus.android.importClass('android.content.Intent')
let intent = new Intent('android.settings.action.MANAGE_OVERLAY_PERMISSION', Uri.parse('package:' + pkName))

/*判断是否获取了权限*/
if (!Settings.canDrawOverlays(main)) {
    main.startActivityForResult(intent, 5004) /* 转跳到悬浮窗设置 */
}

问题记录

1.起步

常用的一些native.js代码:https://ask.dcloud.net.cn/article/114

安卓分区存储注意事项:https://ask.dcloud.net.cn/article/36199#io

一般手机都会限制应用后台运行(后台几分钟后断网、息屏断网等等),需要手动修改应用的后台运行为无限制。

目前native.js是不支持继承,应该避免使用继承来实现,可以将对象示例化调用来避免继承(多数情况下是可以避免的)。对于重写暂时是没有办法实现(毕竟java本身不是动态语言),可以使用Interface来解决部分问题。上述两类问题确实会限制native.js的能力

 plus.device.setWakelock(true);//保持程序唤醒

wakelock是一种锁的机制,只要有应用拿着这个锁,CPU就无法进入休眠状态,一直处于工作状态。

Android为了确保应用程序中关键代码的正确执行,提供了Wake Lock的API,使得应用程序有权限通过代码阻止AP进入休眠状态。但如果不领会Android设计者的意图而滥用Wake Lock API,为了自身程序在后台的正常工作而长时间阻止AP进入休眠状态,就会成为待机电池杀手。

2.通知推送

通知分为重要、不重要等级别,已经是否可以悬浮,是否可以通知声音。

通话状态监听

1.查阅的文档

https://developer.android.com/reference/android/telephony/PhoneStateListener https://developer.android.com/reference/android/telephony/TelephonyCallback.CallStateListener https://developer.android.com/reference/android/telephony/TelephonyManager#registerTelephonyCallback(java.util.concurrent.Executor,%20android.telephony.TelephonyCallback) https://developer.android.com/reference/java/util/concurrent/Executor

安卓权限

  1. android.permission.SYSTEM_ALERT_WINDOW,悬浮窗权限,显示系统窗口。
  2. android.permission.REORDER_TASKS,重新排序系统Z轴运行中的任务。
  3. android.permission.RECORD_AUDIO,录制声音通过手机或耳机的麦克。
  4. android.permission.CALL_PHONE,允许程序从非系统拨号器里输入电话号码
  5. android.permission.CAMERA,允许访问摄像头进行拍照
  6. android.permission.WAKE_LOCK ,允许程序在手机屏幕关闭后后台进程仍然运行
  7. android.permission.MODIFY_AUDIO_SETTINGS,修改声音设置信息
  8. android.permission.WRITE_EXTERNAL_STORAGE,允许程序写入外部存储,如SD卡上写文件
  9. android.permission.WRITE_SETTINGS,允许读写系统设置项
  10. android.permission.READ_PHONE_STATE,允许读取手机通话状态
  11. android.permission.READ_CALL_LOG,允许读取通话记录(uniapp只有正式的安装包才能获取)
  12. android.permission.WRITE_CALL_LOG,允许修改通话记录
  13. android.permission.READ_CONTACTS,允许读取通讯录

代码记录

官方文档:https://ask.dcloud.net.cn/article/114

1. 获取通话状态

plus.android.importClass("android.telephony.TelephonyManager");
let Context = plus.android.importClass("android.content.Context");
let TelephonyManager = plus.android.runtimeMainActivity().getSystemService(Context.TELEPHONY_SERVICE);
let code = TelephonyManager.getCallState();

2.获取Context类

let context=plus.android.runtimeMainActivity().getApplicationContext();
context.getFilesDir().getPath();  //当前应用的文件目录
context.getFilesDir().getCacheDir();  //当前应用的临时文件目录

3.Environment类

let environment = plus.android.importClass("android.os.Environment");
var sdRoot = environment.getExternalStorageDirectory(); //文件夹根目录

读取短信

1.ContentResolver

机中短信数据库相关字段包括:

  • _id:短信序号,如100
  • address:发件人地址,即手机号,如+8613811810000,这里需要注意的是手机号是否加+86,可以加上86和不加86分别测试下
  • person:发件人,如果发件人在通讯录中则为具体姓名,陌生人为null
  • date:日期,long型,如1256539465022,可以对日期显示格式进行设置,这里在用sqlite语句进行筛选时date字段单位是毫秒
  • protocol:协议0SMS_RPOTO短信,1MMS_PROTO彩信
  • read:是否阅读0未读,1已读
  • status:短信状态-1接收,0complete,64pending,128failed
  • type:短信类型1是接收到的,2是已发出
  • body:短信具体内容

读取短信内容的uri为:

Uri uri = Uri.parse(“content://sms”); //读取所有短信
Uri uri = Uri.parse(“content://sms/inbox”); //读取收件箱短信

2022-11-06

1.uts

uts,全称 uni type script,是一门跨平台的、高性能的、强类型的现代编程语言。

它可以被编译为不同平台的编程语言,如:

  • web平台,编译为JavaScript
  • Android平台,编译为Kotlin
  • iOS平台,编译为Swift(HX 3.6.7+ 版本支持)

uts 采用了与 ts 基本一致的语法规范,支持绝大部分 ES6 API。

开发指南:https://uniapp.dcloud.net.cn/plugin/uts-plugin.html

2.问题记录

  1. scss文件在App.vue内引入无效(未设置scope),单个组件内引入有效,原因未知;
  2. uniapp 不支持* css选择器。小程序不支持标签选择器;
  3. 小程序内因为生命周期的原因,会出现provide和inject无法使用的情况