后台服务形式(service)实现android推送

文章参考:http://www.189works.com/article-17269-1.html

1.消息推送机制
     服务器器端需要变被动为主动,通知客户一些开发商认为重要的信息,无论应用程序是否正在运行或者关闭。
     我想到了一句话:Don't call me,i will call you!
     QQ今天在右下角弹出了一个对话框:"奥巴马宣布本拉登挂了...",正是如此。
     自作聪明,就会带点小聪明,有人喜欢就有人讨厌。
2.独立进程
     无论程序是否正在运行,我们都要能通知到客户,我们需要一个独立进程的后台服务。
     我们需要一个独立进程的后台服务。
     在AndroidManifest.xml中注册Service时,有一个android:process属性,如果这个属性以"."开头,则为此服务开启一个全局的独立进程,如果以":"开头则为此服务开启一个为此应用私有的独立进程。举个具体的例子吧,我们新建了一个 Application,创建了主进程com.cnblogs.tianxia,那么:
1
2  
3
4
5
    我们没必要建立一个全局的,本文选择第二种方案,创建一个当前应用私有的独立进程。
3.通知用户和点击查看
01 public class MessageService extends Service { 
02   
03     //获取消息线程 
04     private MessageThread messageThread = null; 
05   
06     //点击查看 
07     private Intent messageIntent = null; 
08     private PendingIntent messagePendingIntent = null; 
09   
10     //通知栏消息 
11     private int messageNotificationID = 1000; 
12     private Notification messageNotification = null; 
13     private NotificationManager messageNotificatioManager = null; 
14   
15     public IBinder onBind(Intent intent) { 
16         return null; 
17     } 
18   
19     @Override
20     public int onStartCommand(Intent intent, int flags, int startId) { 
21         //初始化 
22         messageNotification = new Notification(); 
23         messageNotification.icon = R.drawable.icon; 
24         messageNotification.tickerText = "新消息"; 
25         messageNotification.defaults = Notification.DEFAULT_SOUND; 
26         messageNotificatioManager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE); 
27   
28         messageIntent = new Intent(this, MessageActivity.class); 
29         messagePendingIntent = PendingIntent.getActivity(this,0,messageIntent,0); 
30   
31         //开启线程 
32         messageThread = new MessageThread(); 
33         messageThread.isRunning = true; 
34         messageThread.start(); 
35   
36         return super.onStartCommand(intent, flags, startId);  
37     } 
38       
39     /** 
40      * 从服务器端获取消息 
41      * 
42      */
43     class MessageThread extends Thread{ 
44         //运行状态,下一步骤有大用 
45         public boolean isRunning = true; 
46         public void run() { 
47             while(isRunning){ 
48                 try { 
49                     //休息10分钟 
50                     Thread.sleep(600000); 
51                     //获取服务器消息 
52                     String serverMessage = getServerMessage(); 
53                     if(serverMessage!=null&&!"".equals(serverMessage)){ 
54                         //更新通知栏 
55                         messageNotification.setLatestEventInfo(MessageService.this,"新消息","奥巴马宣布,本拉登兄弟挂了!"+serverMessage,messagePendingIntent); 
56                         messageNotificatioManager.notify(messageNotificationID, messageNotification); 
57                         //每次通知完,通知ID递增一下,避免消息覆盖掉 
58                         messageNotificationID++; 
59                     } 
60                 } catch (InterruptedException e) { 
61                     e.printStackTrace(); 
62                 } 
63             } 
64         } 
65     } 
66   
67     /** 
68      * 这里以此方法为服务器Demo,仅作示例 
69      * @return 返回服务器要推送的消息,否则如果为空的话,不推送 
70      */
71     public String getServerMessage(){ 
72         return "YES!"; 
73     } 
74 }
  其中MessageActivity是点击跳转的activity,负责处理查看详细信息。
  我们在其他Activity中调用一下:
1 boolean isMessagePush = true;//不开启就设置为false; 
2 ... 
3 if(isMessagePush){ 
4      startService(new Intent(this, MessageService.class)) 
5 };
  运行一下:


4.停止服务
1 stopService(new Intent(MyActivity.this,MessageService.class)); 
2 setMessagePush(false);//设置配置文件或数据库中flag为false
    运行一下,停止服务后,却出乎意料的并没有停下来,怎么回事?是不是代码写错了?
    代码没有错,错在我们停止了服务,却没有停止进程,退出线程。
5.退出线程
    实践证明,Thread的stop()方法并不可靠。但是我们有其他的办法。
    在代码面前,程序员就是上帝。
    退出线程有两种方法。
    第一种方法,强制退出。
1 //杀死该线程所在的进程,自然就退出了 
2 System.exit(0);
   第二种方法,设置isRunning为false。
1 //前面说到了isRunning这个标志,设置为false后,线程的执行就从while循环中跳出来了,然后自然结束掉了 
2 messageThread.isRunning = false;
   综合一下,我们在MessageService中重载onDestroy()方法如下:
1 @Override
2 public void onDestroy() { 
3             System.exit(0); 
4             //或者,二选一,推荐使用System.exit(0),这样进程退出的更干净 
5             //messageThread.isRunning = false; 
6             super.onDestroy(); 
7 }
   好了,现在无论是手动停止,还是从任务管理器中强制停止Service,消息服务和消息线程都能正常的停止和退出了。
   我想我已经清楚了说明了消息推送机制的实现原理,觉得好的话,各位同道,支持一下!

 

你可能感兴趣的:(service,Android,推送,C2DM,push)