CN107239275A - 应用运行方法、终端及计算机可读存储介质 - Google Patents
应用运行方法、终端及计算机可读存储介质 Download PDFInfo
- Publication number
- CN107239275A CN107239275A CN201710350054.4A CN201710350054A CN107239275A CN 107239275 A CN107239275 A CN 107239275A CN 201710350054 A CN201710350054 A CN 201710350054A CN 107239275 A CN107239275 A CN 107239275A
- Authority
- CN
- China
- Prior art keywords
- instruction
- threads
- application
- application operating
- function
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Abstract
本发明公开了一种应用运行方法,该方法包括:在接收到应用操作指令时,判断所述应用操作指令是属于UI交互类指令,还是属于功能启动类指令;若所述应用操作指令属于UI交互类指令,则通过UI线程调用对应的UI组件,以执行所述应用操作指令对应的UI交互操作;若所述应用操作指令属于功能启动类指令,则通过主线程执行所述应用操作指令对应的功能启动操作。本发明还公开了一种智能终端和计算机可读存储介质。本发明将UI线程和主线程剥离,由UI线程专门负责UI交互类操作,而把启动功能等必须在主线程运行的事情放在主线程,从而优化系统性能,让用户在操作UI时不会有卡顿感,给用户带来流程的操作感,提高用户的体验。
Description
技术领域
本发明涉及应用程序技术领域,尤其涉及一种应用运行的方法、终端及计算机可读存储介质。
背景技术
Android系统是目前智能终端的主流系统之一。在Android系统中,当启动一个应用app时,系统会创建一个主线程。这个主线程负责处理与UI(User Interface,用户界面)相关的事件,例如,用户的按键事件,屏幕绘图事件等;同时,这个主线程还把相关的事件分发到对应的组件进行处理,因此这个主线程通常又被称为UI线程。
在这种单线程运行机制下,同一个进程里的UI组件都会在UI线程(即主线程)里实例化,系统对每一个组件的调用也都从UI线程分发出去。另外,由于Android UI toolkit的特性,在通过非UI线程调用Android中的UI组件时,这个非UI线程是不安全的(未上锁的),可能会出现其它线程同时访问同一代码、产生不确定的结果的情况。这就要求把所有的UI操作都放在UI线程里。这样的结果就是,响应系统回调的事件(比如响应用户动作的onKeyDown()和各种生命周期回调)都要在UI线程里运行。
采用这种运行方法,系统在执行密集任务的时候,其性能会很差。例如,在某一时刻所有的工作都在UI线程进行,此时如果要做一些比较耗时的工作(比如访问网络或者数据库查询),会阻塞UI线程,导致事件停止分发(包括绘制事件);此时对用户而言,应用看起来就像是卡顿了,甚至于如果UI线程阻塞的时间太长(例如超过5s),用户就会看到应用无响应的提示,从而降低了用户的体验。
发明内容
本发明的主要目的在于提出一种应用运行方法、终端及计算机可读存储介质,旨在解决应用运行卡顿、流畅度不高的技术问题。
为实现上述目的,本发明提供一种应用运行方法,所述应用运行方法应用于智能终端,所述智能终端设置有用户界面UI线程和主线程,所述应用运行方法包括以下步骤:
在接收到应用操作指令时,判断所述应用操作指令是属于UI交互类指令,还是属于功能启动类指令;
若所述应用操作指令属于UI交互类指令,则通过所述UI线程调用对应的UI组件,以执行所述应用操作指令对应的UI交互操作;
若所述应用操作指令属于功能启动类指令,则通过所述主线程执行所述应用操作指令对应的功能启动操作。
可选地,所述若所述操作指令属于UI交互类指令,则通过所述UI线程调用对应的UI组件,以执行所述应用操作指令对应的UI交互操作的步骤包括:
若所述操作指令属于UI交互类指令,则根据所述操作指令向所述UI线程的消息队列插入对应的操作消息;
通过所述UI线程读取所述消息队列的操作消息,并调用对应的UI组件对所述操作消息进行处理。
可选地,所述操作消息中包括优先级标识,所述通过所述UI线程读取所述消息队列的操作消息,并调用对应的UI组件对所述操作消息进行处理的步骤包括:
通过所述UI线程优选读取所述消息队列中的高优先级操作消息,并调用对应的UI组件对所述高优先级操作消息进行处理。
可选地,所述若所述操作指令属于功能启动类指令,则通过所述主线程执行所述应用操作指令对应的功能启动操作的步骤之后,还包括:
若所述功能启动操作中需要执行UI回调操作,则通过所述UI线程执行所述UI回调操作。
可选地,所述功能启动操作包括活动Activity启动操作和服务Service启动操作。
此外,为实现以上目的,本发明还提供一种智能终端,所述智能终端包括处理器、存储器及存储在所述存储器上并可在所述处理器上运行的应用运行程序,其中所述应用运行程序被所述处理器执行时实现以下步骤:
在接收到应用操作指令时,判断所述应用操作指令是属于UI交互类指令,还是属于功能启动类指令;
若所述操作指令属于UI交互类指令,则通过所述UI线程调用对应的UI组件,以执行所述应用操作指令对应的UI交互操作;
若所述操作指令属于功能启动类指令,则通过所述主线程执行所述应用操作指令对应的功能启动操作。
可选地,所述应用运行程序被所述处理器执行时,还实现以下步骤:
若所述操作指令属于UI交互类指令,则根据所述操作指令向所述UI线程的消息队列插入对应的操作消息;
通过所述UI线程读取所述消息队列的操作消息,并调用对应的UI组件对所述操作消息进行处理。
可选地,所述操作消息中包括优先级标识,所述应用运行程序被所述处理器执行时,还实现以下步骤:
通过所述UI线程优选读取所述消息队列中的高优先级操作消息,并调用对应的UI组件对所述高优先级操作消息进行处理。
可选地,所述功能启动操作包括活动Activity启动操作和服务Service启动操作,所述操作消息中包括优先级标识,所述应用运行程序被所述处理器执行时,还实现以下步骤:
若所述功能启动操作中需要执行UI回调操作,则通过所述UI线程执行所述UI回调操作。
此外,为实现以上目的,本发明还提供一种计算机可读存储介质,所述计算机可读存储介质上存储有应用运行程序,所述应用运行程序被处理器执行时实现如上述的应用运行方法的步骤。
本发明通过在接收到应用操作指令时,判断所述应用操作指令是属于UI交互类指令,还是属于功能启动类指令;若所述应用操作指令属于UI交互类指令,则通过所述UI线程调用对应的UI组件,以执行所述应用操作指令对应的UI交互操作;若所述应用操作指令属于功能启动类指令,则通过所述主线程执行所述应用操作指令对应的功能启动操作。通过以上方式,本发明把UI线程和主线程剥离开,由UI线程专门负责UI交互类操作,而把系统启动功能等必须在主线程运行的事情放在主线程,使得主线程中耗时的操作不会影响UI交互操作的执行,让用户在操作UI时不会有卡顿感,给用户带来流程的操作感,提高用户的体验。
附图说明
图1为实现本发明各个实施例的智能终端硬件结构示意图;
图2为本发明应用运行方法第一实施例的流程示意图;
图3为图2所述若所述操作指令属于UI交互类指令,则通过所述UI线程调用对应的UI组件,以执行所述应用操作指令对应的UI交互操作的细化流程示意图;
图4为本发明应用运行方法第二实施例的流程示意图。
本发明目的的实现、功能特点及优点将结合实施例,参照附图做进一步说明。
具体实施方式
应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
在后续的描述中,使用用于表示元件的诸如“模块”、“部件”或“单元”的后缀仅为了有利于本发明的说明,其本身没有特定的意义。因此,“模块”、“部件”或“单元”可以混合地使用。
本发明实施例方案中,应用运行方法应用于智能终端,该智能终端可以以各种形式来实施,例如,本发明中涉及的智能终端可以包括诸如手机、平板电脑、笔记本电脑、掌上电脑、个人数字助理(Personal Digital Assistant,PDA)、便捷式媒体播放器(PortableMedia Player,PMP)、导航装置、可穿戴设备、智能手环、计步器等移动终端,以及诸如数字TV、台式计算机等固定终端。
后续描述中将以移动终端为例进行说明,本领域技术人员将理解的是,除了特别用于移动目的的元件之外,根据本发明的实施方式的构造也能够应用于固定类型的终端。
请参阅图1,图1为实现本发明各个实施例的应用运行终端硬件结构示意图,该终端100可以包括:RF(Radio Frequency,射频)单元101、WiFi模块102、音频输出单元103、A/V(音频/视频)输入单元104、传感器105、显示单元106、用户输入单元107、接口单元108、存储器109、处理器110、以及电源111等部件。本领域技术人员可以理解,图1中示出的终端结构并不构成对应用运行终端的限定,应用运行终端可以包括比图示更多或更少的部件,或者组合某些部件,或者不同的部件布置。
下面结合图1对应用运行终端的各个部件进行具体的介绍:
射频单元101可用于收发信息或通话过程中,信号的接收和发送,具体的,将基站的下行信息接收后,给处理器110处理;另外,将上行的数据发送给基站。通常,射频单元101包括但不限于天线、至少一个放大器、收发信机、耦合器、低噪声放大器、双工器等。此外,射频单元101还可以通过无线通信与网络和其他设备通信。上述无线通信可以使用任一通信标准或协议,包括但不限于GSM(Global System of Mobile communication,全球移动通讯系统)、GPRS(General Packet Radio Service,通用分组无线服务)、CDMA2000(CodeDivision Multiple Access 2000,码分多址2000)、WCDMA(Wideband Code DivisionMultiple Access,宽带码分多址)、TD-SCDMA(Time Division-Synchronous CodeDivision Multiple Access,时分同步码分多址)、FDD-LTE(Frequency DivisionDuplexing-Long Term Evolution,频分双工长期演进)和TDD-LTE(Time DivisionDuplexing-Long Term Evolution,分时双工长期演进)等。
WiFi属于短距离无线传输技术,应用运行终端通过WiFi模块102可以帮助用户收发电子邮件、浏览网页和访问流式媒体等,它为用户提供了无线的宽带互联网访问。虽然图2示出了WiFi模块102,但是可以理解的是,其并不属于智能终端的必须构成,完全可以根据需要在不改变发明的本质的范围内而省略。
音频输出单元103可以在终端100处于呼叫信号接收模式、通话模式、记录模式、语音识别模式、广播接收模式等等模式下时,将射频单元101或WiFi模块102接收的或者在存储器109中存储的音频数据转换成音频信号并且输出为声音。而且,音频输出单元103还可以提供与终端100执行的特定功能相关的音频输出(例如,呼叫信号接收声音、消息接收声音等等)。音频输出单元103可以包括扬声器、蜂鸣器等等。
A/V输入单元104用于接收音频或视频信号。A/V输入单元104可以包括图形处理器(Graphics Processing Unit,GPU)1041和麦克风1042,图形处理器1041对在视频捕获模式或图像捕获模式中由图像捕获装置(如摄像头)获得的静态图片或视频的图像数据进行处理。处理后的图像帧可以显示在显示单元106上。经图形处理器1041处理后的图像帧可以存储在存储器109(或其它存储介质)中或者经由射频单元101或WiFi模块102进行发送。麦克风1042可以在电话通话模式、记录模式、语音识别模式等等运行模式中经由麦克风1042接收声音(音频数据),并且能够将这样的声音处理为音频数据。处理后的音频(语音)数据可以在电话通话模式的情况下转换为可经由射频单元101发送到移动通信基站的格式输出。麦克风1042可以实施各种类型的噪声消除(或抑制)算法以消除(或抑制)在接收和发送音频信号的过程中产生的噪声或者干扰。
应用运行终端100还包括至少一种传感器105,比如光传感器、运动传感器以及其他传感器。具体地,光传感器包括环境光传感器及接近传感器,其中,环境光传感器可根据环境光线的明暗来调节显示面板1061的亮度,接近传感器可在终端100移动到耳边时,关闭显示面板1061和/或背光。作为运动传感器的一种,加速计传感器可检测各个方向上(一般为三轴)加速度的大小,静止时可检测出重力的大小及方向,可用于识别手机姿态的应用(比如横竖屏切换、相关游戏、磁力计姿态校准)、振动识别相关功能(比如计步器、敲击)等;至于手机还可配置的指纹传感器、压力传感器、虹膜传感器、分子传感器、陀螺仪、气压计、湿度计、温度计、红外线传感器等其他传感器,在此不再赘述。
显示单元106用于显示由用户输入的信息或提供给用户的信息。显示单元106可包括显示面板1061,可以采用液晶显示器(Liquid Crystal Display,LCD)、有机发光二极管(Organic Light-Emitting Diode,OLED)等形式来配置显示面板1061。
用户输入单元107可用于接收输入的数字或字符信息,以及产生与移动终端的用户设置以及功能控制有关的键信号输入。具体地,用户输入单元107可包括触控面板1071以及其他输入设备1072。触控面板1071,也称为触摸屏,可收集用户在其上或附近的触摸操作(比如用户使用手指、触笔等任何适合的物体或附件在触控面板1071上或在触控面板1071附近的操作),并根据预先设定的程式驱动相应的连接装置。触控面板1071可包括触摸检测装置和触摸控制器两个部分。其中,触摸检测装置检测用户的触摸方位,并检测触摸操作带来的信号,将信号传送给触摸控制器;触摸控制器从触摸检测装置上接收触摸信息,并将它转换成触点坐标,再送给处理器110,并能接收处理器110发来的命令并加以执行。此外,可以采用电阻式、电容式、红外线以及表面声波等多种类型实现触控面板1071。除了触控面板1071,用户输入单元107还可以包括其他输入设备1072。具体地,其他输入设备1072可以包括但不限于物理键盘、功能键(比如音量控制按键、开关按键等)、轨迹球、鼠标、操作杆等中的一种或多种,具体此处不做限定。
进一步的,触控面板1071可覆盖显示面板1061,当触控面板1071检测到在其上或附近的触摸操作后,传送给处理器110以确定触摸事件的类型,随后处理器110根据触摸事件的类型在显示面板1061上提供相应的视觉输出。虽然在图1中,触控面板1071与显示面板1061是作为两个独立的部件来实现终端的输入和输出功能,但是在某些实施例中,可以将触控面板1071与显示面板1061集成而实现终端的输入和输出功能,具体此处不做限定。
接口单元108用作至少一个外部装置与终端100连接可以通过的接口。例如,外部装置可以包括有线或无线头戴式耳机端口、外部电源(或电池充电器)端口、有线或无线数据端口、存储卡端口、用于连接具有识别模块的装置的端口、音频输入/输出(I/O)端口、视频I/O端口、耳机端口等等。接口单元108可以用于接收来自外部装置的输入(例如,数据信息、电力等等)并且将接收到的输入传输到终端100内的一个或多个元件或者可以用于在应用运行终端100和外部装置之间传输数据。
存储器109可用于存储软件程序以及各种数据。存储器109可主要包括存储程序区和存储数据区,其中,存储程序区可存储操作系统、至少一个功能所需的应用程序(比如声音播放功能、图像播放功能等)等;存储数据区可存储根据手机的使用所创建的数据(比如音频数据、电话本等)等。此外,存储器109可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他易失性固态存储器件。
处理器110是终端的控制中心,利用各种接口和线路连接整个终端的各个部分,通过运行或执行存储在存储器109内的应用运行程序和/或模块,以及调用存储在存储器109内的数据,执行智能终端的各种功能和处理数据,从而对智能终端进行整体监控。处理器110可包括一个或多个处理单元;优选的,处理器110可集成应用处理器和调制解调处理器,其中,应用处理器主要处理操作系统、用户界面和应用程序等,调制解调处理器主要处理无线通信。可以理解的是,上述调制解调处理器也可以不集成到处理器110中。
应用运行终端100还可以包括给各个部件供电的电源111(比如电池),优选的,电源111可以通过电源管理系统与处理器110逻辑相连,从而通过电源管理系统实现管理充电、放电、以及功耗管理等功能。
尽管图1未示出,应用运行终端100还可以包括蓝牙模块等,在此不再赘述。
基于上述应用运行终端的硬件结构,提出本发明应用运行方法的各个实施例。
参照图2,图2为本发明应用运行方法第一实施例的流程示意图。
本实施例中,所述应用运行方法应用于智能终端,所述应用运行方法包括以下步骤:
步骤S10,在接收到应用操作指令时,判断所述应用操作指令是属于UI交互类指令,还是属于功能启动类指令;
本实施例中,应用运行方法所应用于智能终端。本实施例中的智能终端以安卓系统的智能手机进行说明,当然该智能终端还可以是其它的平板电脑、笔记本电脑、掌上电脑、个人数字助理(Personal Digital Assistant,PDA)、便捷式媒体播放器(PortableMedia Player,PMP)、导航装置、可穿戴设备、智能手环、计步器等移动终端,以及诸如数字TV、台式计算机等固定终端。
对于安卓系统,通常是采用单线程模型来运行应用,即当启动一个应用app时,系统会创建一个主线程,这个主线程负责处理与UI(User Interface,用户界面)相关的事件,同时主线程还把相关的事件分发到对应的组件进行处理,因此这个主线程通常又被称为UI线程。采用这种运行方法,系统在当app做一些比较重的工作的时候,其性能会很差。例如,在某一时刻所有的工作都在UI线程进行,此时如果要做一些比较耗时的工作(比如访问网络或者数据库查询),会阻塞UI线程,导致事件停止分发(包括绘制事件);此时对用户而言,应用看起来就像是卡顿了,甚至于如果UI线程阻塞的时间太长(例如超过5s),用户就会看到应用无响应的提示,从而降低了用户的体验。
基于现有单线程模型的缺陷,本实施例提出把UI线程和主线程剥离出来,即单独新建一个线程专门完成UI线程要做的事情(包括绘制事件、响应用户动作的onKeyDown()),而把系统启动Activity或者Service必须在主线程运行的事情仍放在主线程,从而完成对系统性能的优化,提高用户操作的流畅感,提高用户的体验。
具体的,本实施例中的智能手机包括用户界面UI线程和主线程,其中UI线程主要用于调用UI组件来执行UI交互类操作,而主线程则主要用于执行功能启动类操作。对于UI线程的实现,可以是这样的:在应用程序的入口函数中新建HandlerThread,该HandlerThread即为UI线程;获取UI线程的Loop,并使用此Loop新建Handler,再将创建UI组件的Runnable以Post的方式发送到Handler中,即可实现UI线程创建。
在完成UI线程的创建时,该Runnable的实现中主要完成UI窗口的添加,窗口中的所有UI组件的交互都会在新建的线程中;之后所有的用户动作,都会默认分发到新建的线程的Hander中处理,而对于UI界面的更新等操作,也是通过UI线程完成。
本实施例中,基于上述双线程的设置,用户在手机中点击操作应用时,将触发应用操作指令;手机在接收到应用操作指令时,将会对该应用操作指令进行分析和判断,判断该应用操作指令是属于UI交互类指令,还是属于功能启动类指令。如果该应用操作指令是属于UI交互类指令,需要通过UI线程来进行处理,即进入步骤S20;如果该应用操作指令是属于功能启动类指令,则需要通过主线程来进行处理,即进入步骤S30。
步骤S20,若所述应用操作指令属于UI交互类指令,则通过所述UI线程调用对应的UI组件,以执行所述应用操作指令对应的UI交互操作;
本实施例中,如果该应用操作指令属于UI交互类指令,则手机会通过UI线程来处理该应用操作指令。这是出于性能优化的考虑:由于Android UI toolkit(主要是这两个包中的组件:android.widget and android.view)的特性,在通过非UI线程调用Android中的UI组件时,该线程是不安全的,可能会出现多线程访问同一代码,产生不确定的结果的情况。例如,刷新界面是UI线程的主要作用之一,可以通过Android的invalidate()方法实现,而如果在非UI线程中调用invalidate()执行刷新步骤,会到导致线程不安全,也就是说,在非UI线程中刷新界面的时候,UI线程或其他非UI线程也可能在同时刷新界面,这样可能会导致多个界面刷新操作的不同步,而当多个操作不同步时,界面混乱不堪,即导致线程不安全。虽然可以通过加锁机制解决线程的这个安全问题,但是加锁操作另一方面会降低手机系统的运行效率。因此对于UI组件而言,并没有进行加锁限制其的多线程访问,而是规定在Android系统中不能通过非UI线程来进行UI组件的操作,所有的UI操作必须要在UI线程中调用执行。因此,对于属于UI交互类指令的应用操作指令,需要通过UI线程来进行响应处理。
步骤S30,若所述应用操作指令属于功能启动类指令,则通过所述主线程执行所述应用操作指令对应的功能启动操作。
本实施例中,如果该应用操作指令属于功能启动类指令,则手机会通过主线程来处理该应用操作指令,其中的功能启动类指令主要用于执行功能启动操作。而对于功能启动操作又可以包括活动Activity启动操作和服务Service启动操作。
具体的,Activity是Android的四大组件之一,是一个用于与用户交互的系统模块,可以用于显示View(视图),通常手机看到的APP界面其实就是Activity,也可以从View中获取数据然后把数据传递给控制层进行处理,最后再显示处理的结果。
Service同样作为Android的四大组件之一,其主要实现不需要界面,而是在后台执行耗时操作,进行功能调度或数据支持,辅助应用于系统中的其他组件或系统服务进行沟通;其他的应用组件能够启动Service,并且当用户操作手机切换到另外的应用场景时,Service将持续在后台运行。以闹钟应用为例,闹钟Service会在手机开机时自动启动,并读取设定好的闹钟信息,然后在手机系统的定时服务中注册,以便到时能够提醒;同时,闹钟应用还要监听一些和时间变化相关的事件,例如时间或时区改变,以便能够立即检查所设的提醒事件是否到期,以及需要提醒用户等。而当发生相应事件的时候,触发器组中件的BroadcastReceiver.onReceiver函数将被调用。触发器组件本身不能缓存数据或执行过于耗时的操作,因此往往需要通过Context.startService函数将事件转发给对应的服务组件来处理。在这种使用方式下,Service组件将从事件触发器的对象搜集各类事件信息,对其做进一步分析和处理,然后执行更新界面,修改数据等操作,从而对整个应用进行调度,并使其保持正确的状态。
进一步的,功能启动类指令对应的功能启动操作,虽然其实际执行过程是在主线程中实现,但是启动的操作却不局限于主线程,换而言之,可以在主线程或者新建的UI线程中启动功能启动操作(例如Activity或者Service操作),但这些过程的实际执行都会在主线程,从而不影响UI线程的性能。
本实施例中,通过在接收到应用操作指令时,判断所述应用操作指令是属于UI交互类指令,还是属于功能启动类指令;若所述应用操作指令属于UI交互类指令,则通过所述UI线程调用对应的UI组件,以执行所述应用操作指令对应的UI交互操作;若所述应用操作指令属于功能启动类指令,则通过所述主线程执行所述应用操作指令对应的功能启动操作。通过以上方式,本实施例把UI线程和主线程剥离开,由UI线程专门负责UI交互类操作,而把系统启动功能等必须在主线程运行的事情放在主线程,使得主线程中耗时的操作不会影响UI交互操作的执行,让用户在操作UI时不会有卡顿感,给用户带来流程的操作感,提高用户的体验。
参照图3,图3为图2所述若所述操作指令属于UI交互类指令,则通过所述UI线程调用对应的UI组件,以执行所述应用操作指令对应的UI交互操作的细化流程示意图。
基于上述图2所示的实施例,步骤S20包括:
步骤S21,若所述操作指令属于UI交互类指令,则根据所述操作指令向所述UI线程的消息队列插入对应的操作消息;
步骤S22,通过所述UI线程读取所述消息队列的操作消息,并调用对应的UI组件对所述操作消息进行处理。
本实施例中,如果手机接收到的应用操作指令属于UI交互类指令,则手机会通过UI线程来处理该应用操作指令。具体的,在手机收到UI交互类指令时,将根据该应用操作指令向UI线程的消息队列插入对应的操作消息。首先,系统通过handler将应用操作指令对应的message(消息)作为参数并通过sendMessage()函数传递给UI线程相应的looper类。在这里,looper类的主要功能是为特定单一线程运行一个消息环,一个线程对应一个looper,一个looper对应一个线程。该looper类在创建并与UI线程关联时,会同时产生一个消息队列messageQueue来传递或控制指令内容,looper则从messageQueue中循环取出消息,即message(消息)。应用操作指令对应的message被加入looper中messageQueue消息队列后,会在looper的循环读取中被取出,UI线程就会根据message中的具体内容调用相关UI组件以对message进行响应处理。
进一步的,如果手机接收到的应用操作指令属于UI交互类指令,还会对该应用操作指令进行分析,以确定该应用操作指令对应UI交互操作的重要程度,并根据其重要程度在操作消息中进行优先级标记。重要的UI交互操作,其操作消息中的优先级标识为高优先级(即对于高优先级的操作消息,代表了重要的UI交互操作)。在对操作消息的优先级标记完成时,会将该操作消息插入UI线程的消息队列;而在通过UI线程对消息队列进行处理的过程中,会优先读取高优先级的操作消息,并根据操作消息的内容调用对应的UI组件以对高优先级的操作消息进行响应处理,从而优先完成重要的UI交互操作,提高应用的流畅度。
再进一步的,如果手机接收到的应用操作指令属于UI交互类指令,还可以对该应用操作指令进行分析,以估计完成该应用操作指令对应UI交互操作所需要的时间(该时间可称为预计完成时间),并在操作消息中标记该UI交互操作的预计完成时间。在对操作消息的预计完成时间标记完成时,会将该操作消息插入UI线程的消息队列;而在通过UI线程对消息队列进行处理的过程中,会优先读取预计完成时间短的操作消息,并根据操作消息的内容调用对应的UI组件以对预计完成时间短的操作消息进行响应处理,从而优先完成简单的UI交互操作,提高应用的流畅度。
本实施例中,可采用消息队列的方式对UI交互类操作进行处理,从而可以异步处理UI交互请求,缓解系统的压力,提高系统的响应速度,提高用户操作的流程感。
参照图4,图4为本发明应用运行方法第二实施例的流程示意图。
基于上述图2所示的实施例,步骤S30之后,还包括:
步骤S40,若所述功能启动操作中需要执行UI回调操作,则通过所述UI线程执行所述UI回调操作。
本实施例中,在通过主线程对功能启动类的应用操作指令进行处理的过程中,如果需要执行UI回调操作,需要通过UI线程来操作对应的UI组件执行。例如,在启动服务Service时,该服务Service启动过程中涉及到界面更新等相关UI操作,需要执行UI回调操作,由于Andoid UI toolkit并不是线程安全的,不能从非UI线程来操纵UI组件,所以此时需要通过UI线程执行相关的UI回调操,从而实现对应的UI交互操作。值得说明的是,此时Service的回调函数仍在主线程中运行,从而完成对应用程序性能的优化。
此外,为了实现以上目的,本发明还提供一种智能终端。
继续参照图2,所述智能终端包括处理器、存储器及存储在所述存储器上并可在所述处理器上运行的应用运行程序,其中所述应用运行程序被所述处理器执行时实现以下步骤:
步骤S10,在接收到应用操作指令时,判断所述应用操作指令是属于UI交互类指令,还是属于功能启动类指令;
本实施例中的智能终端以安卓系统的智能手机进行说明,当然该智能终端还可以是其它的平板电脑、笔记本电脑、掌上电脑、个人数字助理(Personal Digital Assistant,PDA)、便捷式媒体播放器(Portable Media Player,PMP)、导航装置、可穿戴设备、智能手环、计步器等移动终端,以及诸如数字TV、台式计算机等固定终端。
本实施例中,对于安卓系统,通常是采用单线程模型来运行应用,即当启动一个应用app时,系统会创建一个主线程,这个主线程负责处理与UI(User Interface,用户界面)相关的事件,同时主线程还把相关的事件分发到对应的组件进行处理,因此这个主线程通常又被称为UI线程。采用这种运行方法,系统在当app做一些比较重的工作的时候,其性能会很差。例如,在某一时刻所有的工作都在UI线程进行,此时如果要做一些比较耗时的工作(比如访问网络或者数据库查询),会阻塞UI线程,导致事件停止分发(包括绘制事件);此时对用户而言,应用看起来就像是卡顿了,甚至于如果UI线程阻塞的时间太长(例如超过5s),用户就会看到应用无响应的提示,从而降低了用户的体验。
基于现有单线程模型的缺陷,本实施例提出把UI线程和主线程剥离出来,即单独新建一个线程专门完成UI线程要做的事情(包括绘制事件、响应用户动作的onKeyDown()),而把系统启动Activity或者Service必须在主线程运行的事情仍放在主线程,从而完成对系统性能的优化,提高用户操作的流畅感,提高用户的体验。
具体的,本实施例中的智能终端以安卓系统的智能手机进行说明,当然该智能终端还可以是其它安卓系统的平板电脑、笔记本电脑、掌上电脑、个人数字助理(PersonalDigital Assistant,PDA)、便捷式媒体播放器(Portable Media Player,PMP)、导航装置、可穿戴设备、智能手环、计步器等移动终端,以及诸如数字TV、台式计算机等固定终端。
本实施例中的智能手机包括用户界面UI线程和主线程,其中UI线程主要用于调用UI组件来执行UI交互类操作,而主线程则主要用于执行功能启动类操作。对于UI线程的实现,可以是这样的:在应用程序的入口函数中新建HandlerThread,该HandlerThread即为UI线程;获取UI线程的Loop,并使用此Loop新建Handler,再将创建UI组件的Runnable以Post的方式发送到Handler中,即可实现UI线程创建。
在完成UI线程的创建时,该Runnable的实现中主要完成UI窗口的添加,窗口中的所有UI组件的交互都会在新建的线程中;之后所有的用户动作,都会默认分发到新建的线程的Hander中处理,而对于UI界面的更新等操作,也是通过UI线程完成。
本实施例中,基于上述双线程的设置,用户在手机中点击操作应用时,将触发应用操作指令;手机在接收到应用操作指令时,将会对该应用操作指令进行分析和判断,判断该应用操作指令是属于UI交互类指令,还是属于功能启动类指令。如果该应用操作指令是属于UI交互类指令,需要通过UI线程来进行处理,即进入步骤S20;如果该应用操作指令是属于功能启动类指令,则需要通过主线程来进行处理,即进入步骤S30。
步骤S20,若所述应用操作指令属于UI交互类指令,则通过所述UI线程调用对应的UI组件,以执行所述应用操作指令对应的UI交互操作;
本实施例中,如果该应用操作指令属于UI交互类指令,则手机会通过UI线程来处理该应用操作指令。这是出于性能优化的考虑:由于Android UI toolkit(主要是这两个包中的组件:android.widget and android.view)的特性,在通过非UI线程调用Android中的UI组件时,该线程是不安全的,可能会出现多线程访问同一代码,产生不确定的结果的情况。例如,刷新界面是UI线程的主要作用之一,可以通过Android的invalidate()方法实现,而如果在非UI线程中调用invalidate()执行刷新步骤,会到导致线程不安全,也就是说,在非UI线程中刷新界面的时候,UI线程或其他非UI线程也可能在同时刷新界面,这样可能会导致多个界面刷新操作的不同步,而当多个操作不同步时,界面混乱不堪,即导致线程不安全。虽然可以通过加锁机制解决线程的这个安全问题,但是加锁操作另一方面会降低手机系统的运行效率。因此对于UI组件而言,并没有进行加锁限制其的多线程访问,而是规定在Android系统中不能通过非UI线程来进行UI组件的操作,所有的UI操作必须要在UI线程中调用执行。因此,对于属于UI交互类指令的应用操作指令,需要通过UI线程来进行响应处理。
步骤S30,若所述应用操作指令属于功能启动类指令,则通过所述主线程执行所述应用操作指令对应的功能启动操作。
本实施例中,如果该应用操作指令属于功能启动类指令,则手机会通过主线程来处理该应用操作指令,其中的功能启动类指令主要用于执行功能启动操作。而对于功能启动操作又可以包括活动Activity启动操作和服务Service启动操作。
具体的,Activity是Android的四大组件之一,是一个用于与用户交互的系统模块,可以用于显示View(视图),通常手机看到的APP界面其实就是Activity,也可以从View中获取数据然后把数据传递给控制层进行处理,最后再显示处理的结果。
Service同样作为Android的四大组件之一,其主要实现不需要界面,而是在后台执行耗时操作,进行功能调度或数据支持,辅助应用于系统中的其他组件或系统服务进行沟通;其他的应用组件能够启动Service,并且当用户操作手机切换到另外的应用场景时,Service将持续在后台运行。以闹钟应用为例,闹钟Service会在手机开机时自动启动,并读取设定好的闹钟信息,然后在手机系统的定时服务中注册,以便到时能够提醒;同时,闹钟应用还要监听一些和时间变化相关的事件,例如时间或时区改变,以便能够立即检查所设的提醒事件是否到期,以及需要提醒用户等。而当发生相应事件的时候,触发器组中件的BroadcastReceiver.onReceiver函数将被调用。触发器组件本身不能缓存数据或执行过于耗时的操作,因此往往需要通过Context.startService函数将事件转发给对应的服务组件来处理。在这种使用方式下,Service组件将从事件触发器的对象搜集各类事件信息,对其做进一步分析和处理,然后执行更新界面,修改数据等操作,从而对整个应用进行调度,并使其保持正确的状态。
进一步的,功能启动类指令对应的功能启动操作,虽然其实际执行过程是在主线程中实现,但是启动的操作却不局限于主线程,换而言之,可以在主线程或者新建的UI线程中启动功能启动操作(例如Activity或者Service操作),但这些过程的实际执行都会在主线程,从而不影响UI线程的性能。
本实施例中,通过在接收到应用操作指令时,判断所述应用操作指令是属于UI交互类指令,还是属于功能启动类指令;若所述应用操作指令属于UI交互类指令,则通过所述UI线程调用对应的UI组件,以执行所述应用操作指令对应的UI交互操作;若所述应用操作指令属于功能启动类指令,则通过所述主线程执行所述应用操作指令对应的功能启动操作。通过以上方式,本实施例把UI线程和主线程剥离开,由UI线程专门负责UI交互类操作,而把系统启动功能等必须在主线程运行的事情放在主线程,使得主线程中耗时的操作不会影响UI交互操作的执行,让用户在操作UI时不会有卡顿感,给用户带来流程的操作感,提高用户的体验。
继续参照图3,所述应用运行程序被所述处理器执行时,还实现以下步骤:
步骤S21,若所述操作指令属于UI交互类指令,则根据所述操作指令向所述UI线程的消息队列插入对应的操作消息;
步骤S22,通过所述UI线程读取所述消息队列的操作消息,并调用对应的UI组件对所述操作消息进行处理。
本实施例中,如果手机接收到的应用操作指令属于UI交互类指令,则手机会通过UI线程来处理该应用操作指令。具体的,在手机收到UI交互类指令时,将根据该应用操作指令向UI线程的消息队列插入对应的操作消息。首先,系统通过handler将应用操作指令对应的message(消息)作为参数并通过sendMessage()函数传递给UI线程相应的looper类。在这里,looper类的主要功能是为特定单一线程运行一个消息环,一个线程对应一个looper,一个looper对应一个线程。该looper类在创建并与UI线程关联时,会同时产生一个消息队列messageQueue来传递或控制指令内容,looper则从messageQueue中循环取出消息,即message(消息)。应用操作指令对应的message被加入looper中messageQueue消息队列后,会在looper的循环读取中被取出,UI线程就会根据message中的具体内容调用相关UI组件以对message进行响应处理。
进一步的,如果手机接收到的应用操作指令属于UI交互类指令,还会对该应用操作指令进行分析,以确定该应用操作指令对应UI交互操作的重要程度,并根据其重要程度在操作消息中进行优先级标记。重要的UI交互操作,其操作消息中的优先级标识为高优先级(即对于高优先级的操作消息,代表了重要的UI交互操作)。在对操作消息的优先级标记完成时,会将该操作消息插入UI线程的消息队列;而在通过UI线程对消息队列进行处理的过程中,会优先读取高优先级的操作消息,并根据操作消息的内容调用对应的UI组件以对高优先级的操作消息进行响应处理,从而优先完成重要的UI交互操作,提高应用的流畅度。
再进一步的,如果手机接收到的应用操作指令属于UI交互类指令,还可以对该应用操作指令进行分析,以估计完成该应用操作指令对应UI交互操作所需要的时间(该时间可称为预计完成时间),并在操作消息中标记该UI交互操作的预计完成时间。在对操作消息的预计完成时间标记完成时,会将该操作消息插入UI线程的消息队列;而在通过UI线程对消息队列进行处理的过程中,会优先读取预计完成时间短的操作消息,并根据操作消息的内容调用对应的UI组件以对预计完成时间短的操作消息进行响应处理,从而优先完成简单的UI交互操作,提高应用的流畅度。
本实施例中,可采用消息队列的方式对UI交互类操作进行处理,从而可以异步处理UI交互请求,缓解系统的压力,提高系统的响应速度,提高用户操作的流程感。
继续参照图4,所述应用运行程序被所述处理器执行时,还实现以下步骤:
步骤S40,若所述功能启动操作中需要执行UI回调操作,则通过所述UI线程执行所述UI回调操作。
本实施例中,在通过主线程对功能启动类的应用操作指令进行处理的过程中,如果需要执行UI回调操作,需要通过UI线程来操作对应的UI组件执行。例如,在启动服务Service时,该服务Service启动过程中涉及到界面更新等相关UI操作,需要执行UI回调操作,由于Andoid UI toolkit并不是线程安全的,不能从非UI线程来操纵UI组件,所以此时需要通过UI线程执行相关的UI回调操,从而实现对应的UI交互操作。值得说明的是,此时Service的回调函数仍在主线程中运行,从而完成对应用程序性能的优化。
此外,为实现以上目的,本发明还提供一种计算机可读存储介质。
本发明计算机可读存储介质上存储有应用运行程序,所述应用运行程序被处理器执行时实现如上所述的应用运行方法的步骤。
其中,所述应用运行程序被执行时所实现的方法可参照本发明应用运行各个实施例,此处不再赘述。
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到上述实施例方法可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质(如ROM/RAM、磁碟、光盘)中,包括若干指令用以使得一台终端设备(可以是手机,计算机,服务器,空调器,或者网络设备等)执行本发明各个实施例所述的方法。
以上仅为本发明的优选实施例,并非因此限制本发明的专利范围,凡是利用本发明说明书及附图内容所作的等效结构或等效流程变换,或直接或间接运用在其他相关的技术领域,均同理包括在本发明的专利保护范围内。
Claims (10)
1.一种应用运行方法,其特征在于,所述应用运行方法应用于智能终端,所述智能终端设置有用户界面UI线程和主线程,所述应用运行方法包括以下步骤:
在接收到应用操作指令时,判断所述应用操作指令是属于UI交互类指令,还是属于功能启动类指令;
若所述应用操作指令属于UI交互类指令,则通过所述UI线程调用对应的UI组件,以执行所述应用操作指令对应的UI交互操作;
若所述应用操作指令属于功能启动类指令,则通过所述主线程执行所述应用操作指令对应的功能启动操作。
2.如权利要求1所述的应用运行方法,其特征在于,所述若所述操作指令属于UI交互类指令,则通过所述UI线程调用对应的UI组件,以执行所述应用操作指令对应的UI交互操作的步骤包括:
若所述操作指令属于UI交互类指令,则根据所述操作指令向所述UI线程的消息队列插入对应的操作消息;
通过所述UI线程读取所述消息队列的操作消息,并调用对应的UI组件对所述操作消息进行处理。
3.如权利要求2所述的应用运行方法,其特征在于,所述操作消息中包括优先级标识,所述通过所述UI线程读取所述消息队列的操作消息,并调用对应的UI组件对所述操作消息进行处理的步骤包括:
通过所述UI线程优选读取所述消息队列中的高优先级操作消息,并调用对应的UI组件对所述高优先级操作消息进行处理。
4.如权利要求1所述的应用运行方法,其特征在于,所述若所述操作指令属于功能启动类指令,则通过所述主线程执行所述应用操作指令对应的功能启动操作的步骤之后,还包括:
若所述功能启动操作中需要执行UI回调操作,则通过所述UI线程执行所述UI回调操作。
5.如权利要求1至4中任一项所述的应用运行方法,其特征在于,所述功能启动操作包括活动Activity启动操作和服务Service启动操作。
6.一种智能终端,其特征在于,所述智能终端包括处理器、存储器及存储在所述存储器上并可在所述处理器上运行的应用运行程序,其中所述应用运行程序被所述处理器执行时实现以下步骤:
在接收到应用操作指令时,判断所述应用操作指令是属于UI交互类指令,还是属于功能启动类指令;
若所述操作指令属于UI交互类指令,则通过所述UI线程调用对应的UI组件,以执行所述应用操作指令对应的UI交互操作;
若所述操作指令属于功能启动类指令,则通过所述主线程执行所述应用操作指令对应的功能启动操作。
7.如权利要求6所述的智能终端,其特征在于,所述应用运行程序被所述处理器执行时,还实现以下步骤:
若所述操作指令属于UI交互类指令,则根据所述操作指令向所述UI线程的消息队列插入对应的操作消息;
通过所述UI线程读取所述消息队列的操作消息,并调用对应的UI组件对所述操作消息进行处理。
8.如权利要求7所述的智能终端,其特征在于,所述操作消息中包括优先级标识,所述应用运行程序被所述处理器执行时,还实现以下步骤:
通过所述UI线程优选读取所述消息队列中的高优先级操作消息,并调用对应的UI组件对所述高优先级操作消息进行处理。
9.如权利要求6所述的智能终端,其特征在于,所述功能启动操作包括活动Activity启动操作和服务Service启动操作,所述操作消息中包括优先级标识,所述应用运行程序被所述处理器执行时,还实现以下步骤:
若所述功能启动操作中需要执行UI回调操作,则通过所述UI线程执行所述UI回调操作。
10.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质上存储有应用运行程序,所述应用运行程序被处理器执行时实现如权利要求1至5中任一项所述的应用运行方法的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201710350054.4A CN107239275A (zh) | 2017-05-17 | 2017-05-17 | 应用运行方法、终端及计算机可读存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201710350054.4A CN107239275A (zh) | 2017-05-17 | 2017-05-17 | 应用运行方法、终端及计算机可读存储介质 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN107239275A true CN107239275A (zh) | 2017-10-10 |
Family
ID=59985903
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201710350054.4A Pending CN107239275A (zh) | 2017-05-17 | 2017-05-17 | 应用运行方法、终端及计算机可读存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN107239275A (zh) |
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109783028A (zh) * | 2019-01-16 | 2019-05-21 | Oppo广东移动通信有限公司 | I/o调度的优化方法、装置、存储介质及智能终端 |
CN110300328A (zh) * | 2018-03-21 | 2019-10-01 | 腾讯科技(深圳)有限公司 | 一种视频播放控制方法、装置及可读存储介质 |
CN110488971A (zh) * | 2019-07-16 | 2019-11-22 | 北京华捷艾米科技有限公司 | 一种安卓系统体感应用交互实现方法及系统 |
CN113238501A (zh) * | 2021-05-08 | 2021-08-10 | 西安联乘智能科技有限公司 | 一种基于rtos操作系统的车联网控制方法和系统 |
WO2022206709A1 (zh) * | 2021-03-30 | 2022-10-06 | 华为技术有限公司 | 应用程序的组件加载方法及相关装置 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8826276B1 (en) * | 2011-06-21 | 2014-09-02 | Google Inc. | Multi-threaded virtual machine processing on a web page |
CN104360904A (zh) * | 2014-10-16 | 2015-02-18 | 四川长虹电器股份有限公司 | 基于事件总线的模块间消息传递机制 |
CN106371900A (zh) * | 2015-07-23 | 2017-02-01 | 腾讯科技(深圳)有限公司 | 一种实现异步调用的数据处理方法及装置 |
CN106557426A (zh) * | 2016-11-30 | 2017-04-05 | 武汉斗鱼网络科技有限公司 | 一种用于分析Android端应用运行流畅度的方法和系统 |
-
2017
- 2017-05-17 CN CN201710350054.4A patent/CN107239275A/zh active Pending
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8826276B1 (en) * | 2011-06-21 | 2014-09-02 | Google Inc. | Multi-threaded virtual machine processing on a web page |
CN104360904A (zh) * | 2014-10-16 | 2015-02-18 | 四川长虹电器股份有限公司 | 基于事件总线的模块间消息传递机制 |
CN106371900A (zh) * | 2015-07-23 | 2017-02-01 | 腾讯科技(深圳)有限公司 | 一种实现异步调用的数据处理方法及装置 |
CN106557426A (zh) * | 2016-11-30 | 2017-04-05 | 武汉斗鱼网络科技有限公司 | 一种用于分析Android端应用运行流畅度的方法和系统 |
Non-Patent Citations (2)
Title |
---|
LI21: "Android_Servcie_后台服务总结笔记", 《HTTPS://SEGMENTFAULT.COM/A/1190000004040063》 * |
XIANYU.HXY: "Android-Service中执行新线程的几种方式", 《HTTPS://WWW.CNBLOGS.COM/HXY0107/P/4555292.HTML》 * |
Cited By (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110300328A (zh) * | 2018-03-21 | 2019-10-01 | 腾讯科技(深圳)有限公司 | 一种视频播放控制方法、装置及可读存储介质 |
CN110300328B (zh) * | 2018-03-21 | 2021-11-02 | 腾讯科技(深圳)有限公司 | 一种视频播放控制方法、装置及可读存储介质 |
CN109783028A (zh) * | 2019-01-16 | 2019-05-21 | Oppo广东移动通信有限公司 | I/o调度的优化方法、装置、存储介质及智能终端 |
CN110488971A (zh) * | 2019-07-16 | 2019-11-22 | 北京华捷艾米科技有限公司 | 一种安卓系统体感应用交互实现方法及系统 |
CN110488971B (zh) * | 2019-07-16 | 2023-02-28 | 北京华捷艾米科技有限公司 | 一种安卓系统体感应用交互实现方法及系统 |
WO2022206709A1 (zh) * | 2021-03-30 | 2022-10-06 | 华为技术有限公司 | 应用程序的组件加载方法及相关装置 |
CN113238501A (zh) * | 2021-05-08 | 2021-08-10 | 西安联乘智能科技有限公司 | 一种基于rtos操作系统的车联网控制方法和系统 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN107239275A (zh) | 应用运行方法、终端及计算机可读存储介质 | |
CN109814941A (zh) | 一种应用启动方法、终端及计算机可读存储介质 | |
CN107147928A (zh) | 播放视频的方法、终端及计算机可读存储介质 | |
CN109960584A (zh) | Cpu调频控制方法、终端及计算机可读存储介质 | |
CN107436801A (zh) | I/o资源调度方法、终端和计算机可读存储介质 | |
CN108874352A (zh) | 一种信息显示方法及移动终端 | |
CN107577332A (zh) | 一种耗电控制方法、移动终端及计算机可读存储介质 | |
CN108595201A (zh) | 一种应用程序更新方法及移动终端 | |
CN107391241A (zh) | 应用快速启动方法、终端及计算机可读存储介质 | |
CN107463243A (zh) | 一种屏幕控制方法、移动终端和计算机可读存储介质 | |
CN109697088A (zh) | 应用界面加载方法、移动终端及计算机可读存储介质 | |
CN107580350A (zh) | 一种信号强度切换方法、设备及计算机可读存储介质 | |
CN106096367A (zh) | 一种移动终端唤醒处理方法、装置和设备 | |
CN108093117A (zh) | 一种双屏移动终端控制方法及双屏移动终端 | |
CN110147186A (zh) | 一种应用的控制方法及终端设备 | |
CN107247630A (zh) | 线程检测方法、终端及计算机可读存储介质 | |
CN109543474A (zh) | 一种移动终端控制方法及移动终端 | |
CN107967177A (zh) | 基于核心进程的内存优化方法、移动终端及可读存储介质 | |
CN108712558A (zh) | 移动终端的来电提醒方法、移动终端以及可读存储介质 | |
CN108541116A (zh) | 灯光控制方法、终端及计算机可读存储介质 | |
CN110290269A (zh) | 显示控制方法、移动终端及计算机可读存储介质 | |
CN110059464A (zh) | 终端熄屏解锁方法、装置、移动终端及可读存储介质 | |
CN108924352A (zh) | 音质提升方法、终端及计算机可读存储介质 | |
CN109126127A (zh) | 游戏控制方法、双屏移动终端及计算机可读存储介质 | |
CN108416002A (zh) | 一种人机交互方法及移动终端 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
RJ01 | Rejection of invention patent application after publication | ||
RJ01 | Rejection of invention patent application after publication |
Application publication date: 20171010 |