Native.js记录
1. plus.runtimeMainActivity,
获取应用主Activity实例对象,什么是Activity (活动)?
Android的四大组件之一的Activity(活动):Activity是一个应用程序的组件,他在屏幕上提供了一个区域,允许用户在上面做一些交互性的操作, 比如打电话,照相,发送邮件,或者显示一个地图!Activity可以理解成一个绘制用户界面的窗口, 而这个窗口可以填满整个屏幕,也可能比屏幕小或者浮动在其他窗口的上方!
作用:
- Activity用于显示用户界面,用户通过Activity交互完成相关操作
- 一个App允许有多个Activity。
安卓四大组件:Activity、Service、BroadcastReceiver、ContentProvider
相关文档: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/4baf231e7084、https://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方法操作。
代码语言:javascript复制plus.android.newObject
用于不导入类,直接创建一个实例对象,相比导入类对象后使用new操作符创建对象效率要高。
Native.js代码记录
APP从后台移动到前台,相关代码。需要配置权限:REORDER_TASKS(官方是这么说的,但是这个权限好像没啥用)
代码语言:javascript复制/*引入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,应用激活时是作为弹窗出现的。不声明这个权限,在设置列表是看不到这个应用的。
获取悬浮窗权限,让应用可以从后台弹出到前台。
代码语言:javascript复制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的能力
代码语言:javascript复制 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, android.telephony.TelephonyCallback) https://developer.android.com/reference/java/util/concurrent/Executor
安卓权限
- android.permission.SYSTEM_ALERT_WINDOW,悬浮窗权限,显示系统窗口。
- android.permission.REORDER_TASKS,重新排序系统Z轴运行中的任务。
- android.permission.RECORD_AUDIO,录制声音通过手机或耳机的麦克。
- android.permission.CALL_PHONE,允许程序从非系统拨号器里输入电话号码
- android.permission.CAMERA,允许访问摄像头进行拍照
- android.permission.WAKE_LOCK ,允许程序在手机屏幕关闭后后台进程仍然运行
- android.permission.MODIFY_AUDIO_SETTINGS,修改声音设置信息
- android.permission.WRITE_EXTERNAL_STORAGE,允许程序写入外部存储,如SD卡上写文件
- android.permission.WRITE_SETTINGS,允许读写系统设置项
- android.permission.READ_PHONE_STATE,允许读取手机通话状态
- android.permission.READ_CALL_LOG,允许读取通话记录(uniapp只有正式的安装包才能获取)
- android.permission.WRITE_CALL_LOG,允许修改通话记录
- android.permission.READ_CONTACTS,允许读取通讯录
代码记录
官方文档:https://ask.dcloud.net.cn/article/114
1. 获取通话状态
代码语言:javascript复制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类
代码语言:javascript复制let context=plus.android.runtimeMainActivity().getApplicationContext();
context.getFilesDir().getPath(); //当前应用的文件目录
context.getFilesDir().getCacheDir(); //当前应用的临时文件目录
3.Environment类
代码语言:javascript复制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为:
代码语言:javascript复制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.问题记录
- scss文件在App.vue内引入无效(未设置scope),单个组件内引入有效,原因未知;
- uniapp 不支持* css选择器。小程序不支持标签选择器;
- 小程序内因为生命周期的原因,会出现provide和inject无法使用的情况