现在的位置: 首页 > 综合 > 正文

android 单通道多应用Push系统的设计与实现

2018年04月05日 ⁄ 综合 ⁄ 共 2039字 ⁄ 字号 评论关闭

单通道多应用Push系统以service方式运行,如果一个手机安装了多个集成pushSDK的应用,只有一个service实例运行(不会每个应用都开启一个后台服务),即多个应用共享一个push通道,这样的设计目的是:减少手机运行的进程数量,减少内存使用量,减少手机的耗电量,减少网络流量。service实例运行于独立的进程中,不和主进程运行于同一进程,各个应用通过AIDL绑定到service中。

push系统的模型如下:

所需掌握的知识:AIDL ,进程共享, Socket长连接,CPU定时唤醒机制,WIFI与CPU锁

 

1.AIDL:主要是实现进程间通信。

2.进程共享:不同应用共享一个进程,需要在AndroidManifest.xml文件中配置。

        <service
   		    android:label="PushService"
        	android:name="com.boyaa.push.lib.service.PushService"
        	android:process="com.boyaa.push"
        	android:permission="com.boyaa.permission.push"
        	android:exported="true">
             <intent-filter>
                 <action android:name="com.boyaa.push.lib.service.PushService"/>
             </intent-filter>
        </service>

3.Socket长连接:使消息实时性。


4.CPU定时唤醒:当CPU休眠时,能够唤醒CPU连接网络,也是为了尽可能使消息实时获取,使用AlarmManager定时唤醒。


5.WIFI与CPU锁:当CPU休眠唤醒时,需要拿到WIFI锁与CPU锁,是为了WIFI能够马上联网和防止CPU马上休眠,发送请求后,可以放弃WIFI和CPU锁,这样CPU可以又进入休眠状态,同时也是尽可能的节省电量。

	private class LockHandler
	{
		private WifiLock mWifiLock;
		private WakeLock mWakelock;
		
		public void lock(Context context)
		{
			try {
				 WifiManager wifiMgr = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
				 if(wifiMgr.isWifiEnabled())
				 {
					mWifiLock = ((WifiManager) context.getSystemService(Context.WIFI_SERVICE)).createWifiLock(WifiManager.WIFI_MODE_FULL , "wifiLockTAG");
					mWifiLock.acquire();
				 }
			} catch (Exception e) {
				LogUtil.e("LockHandler", ": "+e.getMessage());
			}

			try {
				 mWakelock = ((PowerManager) context.getSystemService(Context.POWER_SERVICE)).newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "WakeLockTAG");
				 mWakelock.acquire();
	        } catch(Exception e) {
	            LogUtil.e("LockHandler", ": "+e.getMessage());
	        }
		}
		
		public void unLock()
		{
			 if(null!=mWakelock&&mWakelock.isHeld())
			 {
				 mWakelock.release();
			 }
				
	        if(null!=mWifiLock&&mWifiLock.isHeld())
	        {
	        	mWifiLock.release();
	        }  	
		}
	}

1.查看进程,发现只有一个名为com.boyaa.push进程

2.服务器向客户端发送数据

3.查看各个客户端接收到的信息,发现git_pushdemo_1和git_pushdemo_2都收到了Server发送过来的数据

Demo里只实现了AIDL,进程共享,socket长连接(CPU定时唤醒机制和WIFI与CPU锁并没有实现,大家可以去自己去实现),当然实际的项目开发过程中可能更复杂,这个Demo简单实现了功能,麻雀虽小五脏俱全,这里只是给大家抛砖引玉。

Demo代码参见github:https://github.com/zz7zz7zz/android-push
csdn:http://download.csdn.net/detail/zz7zz7zz/5887877

文档地址:http://download.csdn.net/detail/zz7zz7zz/6420373

邮箱:zz7zz7zz@163.com

微博http://weibo.com/u/3209971935


抱歉!评论已关闭.