本发明涉及远程控制领域,具体涉及一种远程控制应用程序启动的方法和系统。
背景技术:
在Android系统中启动应用程序通常是通过手动点击的方式来启动应用程序,如果本人不在的情况下是无法对应用程序进行启动的。但是在某些特殊使用情况下的时候,希望能够远程启动应用程序,比如远程测试或者其他应用场景等。所以,为了能够满足特殊使用情况下,需要寻求一种能够远程控制应用程序启动的方法。
技术实现要素:
针对现有技术中存在的缺陷,本发明的目的在于提供一种不需要手动点击启动应用程序,能够远程控制应用程序启动的方法。
为达到以上目的,本发明采取的技术方案是:一种远程控制应用程序启动的方法,该方法包括以下步骤:
客户端自定义静态广播接收器,并利用静态广播接收器接收Android系统启动的广播信息;
建立客户端与服务器之间的连接;
服务器下发启动应用程序的控制命令至客户端,所述启动应用程序的控制命令包括需要启动的应用程序的信息;以及
客户端解析收到的控制命令,获取需要启动的应用程序的信息,并将需要启动的应用程序的信息发送至静态广播接收器,由客户端启动对应的应用程序。
在上述技术方案的基础上,所述客户端自定义静态广播接收器,并利用静态广播接收器接收Android系统启动的广播信息包括以下步骤:
自定义静态广播接收器类和静态广播接收器;
过滤Android系统启动完成的广播事件;
静态广播接收器继承Android系统的广播接受者类;
重写静态广播接收器中的onReceive()方法;
Android系统将启动的广播信息发送至重写的onReceive()方法中。
在上述技术方案的基础上,所述客户端与服务器建立连接后,所述客户端定期发送心跳包至服务器。
在上述技术方案的基础上,所述客户端通过软件开发工具包提供的网络通信方式与服务器建立连接。
在上述技术方案的基础上,客户端与服务器建立连接的步骤包括:
将服务器的网络地址传递到URL中,使用URL的构造函数得到一个URL对象;
建立客户端和服务器之间的连接。
在上述技术方案的基础上,所述服务器通过HTTP将JSON格式的控制命令传递给客户端,所述控制命令包含需要启动的应用程序的包名信息和协议扩展项。
在上述技术方案的基础上,所述客户端启动对应的应用程序的步骤包括:
客户端解析服务器下发的启动应用程序的控制命令,得到需要启动的应用程序的包名信息;
将需要启动的应用程序的包名信息传递到Intent对象中;
静态广播接收器接收Intent对象,Android系统根据应用程序的包名信息,启动对应的应用程序;
判断应用程序是否启动成功,若是,则返回成功状态,若否,则抛出异常消息。
在上述技术方案的基础上,所述客户端通过FastJson解析服务器下发的启动应用程序的控制命令。
在上述技术方案的基础上,所述客户端启动对应的应用程序的步骤还包括启动反馈步骤;所述启动反馈步骤包括;
若客户端启动应用程序成功,客户端将启动成功的信息传递给服务器,服务器停止下发启动应用程序的控制命令;
若客户端启动应用程序失败,客户端将启动失败的信息传递给服务器,服务器重复下发启动应用程序的控制命令,直至应用程序启动成功或达到预设的重复下发次数,当应用程序启动成功,则服务器停止下发启动应用程序的控制命令,若达到预设的重复下发次数,则服务器停止下发启动应用程序的控制命令,并将失败信息记录在日志文件中。
与此同时本发明还提供一种不需要手动点击启动应用程序,能够远程控制应用程序启动的系统。
为达到以上目的,本发明采取的技术方案是:
一种远程控制应用程序启动的系统,其包括通过网络相连接的客户端和服务器,
所述客户端包括静态广播接收器,所述静态广播接收器用于接收Android系统启动的广播信息;
所述服务器下发启动应用程序的控制命令至所述客户端;同时,
所述客户端解析所述控制命令,获取需要启动的应用程序的信息,并将需要启动的应用程序的信息发送至静态广播接收器,客户端在接收到需要启动的应用程序的信息后启动相应应用程序。
与现有技术相比,本发明的优点在于:
(1)本发明中使用了静态广播的方式来进行接受Android系统启动的消息,通过自定义静态广播接收器BootBroadcastReceiver能够达到在不开启应用的情况下就能够接受到Android系统发送过来的广播消息,于传统的动态广播接收这个是一个最大的显著特性。选择自定义静态广播方式接收Android系统启动广播,后续服务就能够在Android系统启动后立刻进行启动,无需人为手动再次启动相关服务了。
(2)本发明中的下发协议中使用了扩充字段extra,这个扩充字段使得本协议能够有更好的扩充性,后续协议进行升级的时候,能够很好的兼容老版本的协议而不需要对客户端和服务器进行协议重写。大大提高了本协议设计的兼容性和扩展性。
(3)本发明中增加了启动反馈步骤,如果启动失败会进行多次尝试,这样能够大大的提升启动成功的概率。相比传统的仅仅下发一次启动命令方式有更高的启动成功率。
附图说明
图1为本发明中远程控制应用程序启动的方法的流程图;
图2为本发明中远程控制应用程序启动的系统的结构框图。
具体实施方式
以下结合附图对本发明作进一步详细说明。
参见图1所示,本发明提供一种远程控制应用程序启动的方法,该方法包括以下步骤:
S1.客户端自定义静态广播接收器,并利用静态广播接收器接收Android系统启动的广播信息;
其具体包括以下步骤:
自定义静态广播接收器类com.android.test.BootBroadcastReceiver和静态广播接收器BootBroadcastReceiver;
过滤Android系统启动完成的广播事件;
静态广播接收器BootBroadcastReceiver继承Android系统的BroadcastReceiver广播接受者类;
重写静态广播接收器BootBroadcastReceiver中的onReceive()方法;
Android系统将启动的广播信息发送至重写的onReceive()方法中。
在Android中广播监听分为2种方式,其一是静态广播监听,其二是动态广播监听,以下描述一下其不同点:
静态广播:
静态注册是常驻型,也就是当应用程序关闭后,如果有信息广播来,程序也会被Android系统调用自动运行。也就是说静态广播可以在应用没有被启动的时候进行注册,当接受到广播信息后应用能够接收到对应的广播信息。
动态广播:
动态注册广播不是常驻型广播,动态广播的注册需要在activity的生命周期中进行注册,也就是说当activit启动的时候去注册动态广播,当activity销毁的时候需要反注册广播,其中activity在android中表示android的一个界面,也就是动态广播需要在应用打开的情况下才能够进行注册,应用程序没有被打开的时候是无法进行动态广播注册的。
由于需要监听Android系统的启动信息,在Android系统刚刚启动完成的时候的应用程序是没有启动的,所以动态广播无法使用。因此本发明选用静态广播的方式来进行接受应用程序的启动广播信息。
在Android系统中监听广播需要注册监听广播事件到系统接口中。只有注册过广播的监听器才能收到特定的广播信号。静态广播的监听器注册需要写在AndroidManifest.xml文件中,只有在AndroidManifest.xml文件中注册过的静态广播才能够接受到对应的广播信息。AndroidManifest.xml指的是Android应用程序的清单描述文件,这个文件中记录了Android的所有界面和广播以及应用所需的权限等信息。
在Android的清单文件AndroidManifest.xml文件中进行广播注册,具体注册方式是在AndroidManifest.xml添加注册监听的事件,具体添加内容如下所示:
下面对注册代码进行分析:
<receiver
android:name="com.android.test.BootBroadcastReceiver">:
Receiver标签表示Android系统的广播接收器标签,这个标签标表示接下来的信息是一个广播接收器。
com.android.test.BootBroadcastReceiver是自定义的广播接收器类。而自定义的静态广播接收器BootBroadcastReceiver用于接受系统的启动广播信息。
<intent-filter>:
这个标签标示广播的过滤标签,Android系统的广播种类非常多而决定接收Android系统的哪些广播,是通过过滤标签来实现的,只有过滤标签中标注的广播信息才能够进行接受,如果当前过滤标间中没有标注的广播信息是不会进行接收的。
<action
android:name="android.intent.action.BOOT_COMPLETED"/>:
这个action标签表示需要过滤的广播事件,具体事件内容是android.intent.action.BOOT_COMPLETED,其中android.intent.action.BOOT_COMPLETED这个表示的是Android系统启动完成的事件。
通过上述方法的广播注册,自定义的静态广播接收器BootBroadcastReceiver就能够接受到Android系统启动的广播信息了。
接受广播信息的处理:
自定义的静态广播接收器BootBroadcastReceiver类需要继承Android系统的BroadcastReceiver类,Android系统用的BroadcastReceiver类是一个专门用于系统接受广播的类,继承BroadcastReceiver类后,自定义的静态广播接收器BootBroadcastReceiver就具备广播接收功能。
BootBroadcastReceiver继承BroadcastReceiver后,重写其中的onReceive方法,重写onReceive方法后,自定义的静态广播接收器BootBroadcastReceiver便能接收到广播消息。当Android系统启动后系统就会将启动的广播消息发送给自定义的静态广播接收器BootBroadcastReceiver中的onReceive方法中,这样就能够在onReceive方法中处理系统启动后的事情。
本发明中使用了静态广播的方式来进行接受Android系统启动的消息,通过自定义静态广播接收器BootBroadcastReceiver能够达到在不开启应用的情况下就能够接受到Android系统发送过来的广播消息,于传统的动态广播接收这个是一个最大的显著特性。选择自定义静态广播方式接收Android系统启动广播,后续服务就能够在Android系统启动后立刻进行启动,无需人为手动再次启动相关服务了。
S2.建立客户端与服务器之间的连接;
建立客户端与服务器之间的连接和包括以下步骤:
1.创建URL对象
URL表示统一资源定位符,用来唯一表示一个网络地址,将服务器的网络地址传递到URL中,使用URL的构造函数来得到一个URL的URL对象。在后续建立和服务器的连接的时候是需要使用URL对象。
2.通过openConnection创建连接
通过调用URL对象中的openConnection函数,就能够建立和服务器之间的连接。
但是建立连接后如果客户端长时间不和服务器进行通信,那么就可能会造成通信超时导致客户端和服务器的连接断开,为了保持连接不会断开,本发明中客户端会定期发送心跳包保持和服务器的通信不断开。
由于HTTP通信中服务器会轮询客户端是否发送消息,服务器如果长时间没有收到客户端回复的消息,服务器为了释放该客户端占用的资源会断开与客户端的链接。如果服务器和客户端断开了连接,那么以后客户端就无法和服务端通信,如果想要继续通信,客户端必须重新建立连接。但是建立连接的这个过程是非常耗时的,为了解决这个问题客户端可以通过发送心跳解决。
此外,客户端定期发送心跳包至服务器(心跳包的内容携带客户端的一些基本信息,比如客户端mac地址,设备相关信息,手机号等,主要目的就是和服务器进行一次通信操作),即可保证客户端与服务器之间定期进行通信。此时,服务器会认为客户端一直需要服务,因而服务器不会断开与客户端的连接。故采用心跳包传输后,能够很好的保障客户端和服务器的连接不断开。
本步骤中,客户端通过软件开发工具包JDK提供的网络通信方式与服务器建立连接。且客户端会定期发送心跳包保持和服务器的通信不断开。此外,由于心跳包中携带了客户端的基本信息,这样服务器就能够很好的判定客户端是否在线,如果在线就可以通过http下发启动应用程序的控制命令来对其进行启动控制。
S3.服务器下发启动应用程序的控制命令至客户端;
由于有心跳的存在,所以服务器和客户端之间的连接不会被断开,服务器可以向客户端下发控制命令字,控制命令是JSON格式的,通过HTTP将控制命令传递给客户端。其中JSON(Java Script Object Notation)是一种轻量级的数据交换格式,它基于ECMAScript的一个子集。
启动应用下发协议:
HTTP传递过来的是一串JSON数据,JSON数据中包含了需要启动的应用程序的信息,比如应用程序的包名信息,JSON数据的具体内容如下所示:
接下来对传递过来的JSON数据进行相关的说明;
Cmd:表示命令,本命令书用于启动应用程序,所以值是startApp;
Package:需要启动的应用的包名;
Extra:协议扩展项,方便后期协议升级时使用,目前预留暂不使用。
由于本下发协议中使用了扩充字段extra,这个扩充字段使得本协议能够有更好的扩充性,后续协议进行升级的时候,能够很好的兼容老版本的协议而不需要对客户端和服务器进行协议重写。大大提高了本协议设计的兼容性和扩展性。
S4.客户端解析收到的控制命令,获取需要启动的应用程序的信息,并将需要启动的应用程序的信息发送至静态广播接收器,由客户端启动对应的应用程序。
客户端收到服务器传递过来的启动应用程序的JSON信息以后,客户端使用通用的FastJson对该JSON信息进行解析,解析后获得该应用程序的启动信息,启动信息包括应用程序的包名信息。
在Android系统中启动一个应用程序需要应用程序的包名信息,因为应用程序包名的唯一性可以确定启动的是哪一个应用程序。
在Android系统中启动应用程序的方法是调用startActivity函数来启动,startActivity函数需要传递一个Intent对象进去。
Intent对象在Android系统中是一个意图对象,通过调用Intent中的setComponentName函数即可将需要启动的应用程序的包名信息传递到Intent对象中。
静态广播接收器接收包含需要启动的应用程序的包名信息的Intent对象后,调用startActivity(Intent)函数,告诉Android系统需要启动一个应用程序,此时Android系统就会将需要启动的对应的应用程序进行启动。如果应用启动成功,那么startActivity函数将会返回成功状态,如果应用启动失败那么startActivity会抛出异常消息出来。
故可以通过startActivity函数是否抛出异常消息来判定应用是否启动成功。
为了提高客户端启动应用程序的成功率,本发明中的客户端启动对应的应用程序的步骤还包括启动反馈步骤,其包括:
若客户端启动应用程序成功,客户端将启动成功的信息传递给服务器,服务器停止下发启动应用程序的控制命令;
若客户端启动应用程序失败,客户端将启动失败的信息传递给服务器,服务器重复下发启动应用程序的控制命令,直至应用程序启动成功或达到预设的重复下发次数,当应用程序启动成功,则服务器停止下发启动应用程序的控制命令,若达到预设的重复下发次数,则服务器停止下发启动应用程序的控制命令,并将失败信息记录在日志文件中。服务器重复下发启动应用程序的控制命令至客户端的次数可以根据需要控制,本发明中为三次。
由于增加了启动反馈步骤,如果启动失败会进行多次尝试,这样能够大大的提升启动成功的概率。相比传统的仅仅下发一次启动命令方式有更高的启动成功率。
本发明还提供一种远程控制应用程序启动的系统,其包括通过网络相连接的客户端和服务器。客户端包括静态广播接收器,静态广播接收器用于接收Android系统启动的广播信息;服务器下发启动应用程序的控制命令至所述客户端;同时,客户端解析控制命令,获取需要启动的应用程序的信息,并将需要启动的应用程序的信息发送至静态广播接收器,客户端在接收到需要启动的应用程序的信息后启动相应应用程序。
本发明不局限于上述实施方式,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也视为本发明的保护范围之内。本说明书中未作详细描述的内容属于本领域专业技术人员公知的现有技术。