android 实时更新与通知 (android poll)

来源:互联网 发布:iebook软件下载 编辑:程序博客网 时间:2024/04/28 05:01

android 实时更新通常有两种方式:poll 和push的方式,push方式要优于poll方式,poll是客户端通过轮询的方式去服务

器端取数据的过程,轮询的时间设置体现了是否实时,设置过短可以做到一定的实时性,但是会手机电量,以及资源的

消耗。push方式可以做到真正的实时性,它是在服务器端有更新时,才通知到客户端。例如现在微信,QQ等的消息到

达通知,都是利用push技术。本实例主要简单的利用android poll 来实现消息的定时通

知。

下面会给出一个实例,该实例是通过在后台每隔一定的时间进行一次加1操作,实例中用到了service ,broadcast,

notification,以及java中的定时器(可以有其他的使用方法通过handler来实现),service就是在后台独立运行的组件,

它甚至可以一直运行下去,直到android内存空间不足把它回收。broadcast,就是广播,顾名思义,就是有新消息是,

将新消息广播出去(需要指定接收者),notification 就是当有新消息到达时,出现在手机左上角状态栏上的通知条,可

以对其进行声音,图标,标题等通知设置。下面给出简单示例。本实例只是简单显示消息及时更新发送通知的流程。可以在用户不在与应用交互时(或者说所有activity退出栈时)定时获得service的更新通知。

 

package com.qing.li;

import android.app.Activity;
import android.app.NotificationManager;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;

/*显示更新的信息界面*/

public class TimingTaskActivity extends Activity  {
    private Intent intent;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Log.i("onCreate","onCreate");
     
        Intent service =new Intent(this,CountingService.class);
        startService(service);//启动service
        intent =getIntent();
    }
  
   /* 已在AndroidManifest中设置launchMode为singleTask。
    * 当本activity已存在栈中时,启动该Activity时,会回调该方法。 (non-Javadoc)
    * @see android.app.Activity#onNewIntent(android.content.Intent)
    */
   @Override
   protected void onNewIntent(Intent intent) {
     Log.i("onNewIntent","onNewIntent");
     this.intent=intent;//新传递过来的intent,数据已变化
    
   
   }
   @Override
   protected void onResume() {
    super.onResume();
    Log.i("onResume","onResume");
    NotificationManager notificationManager =(NotificationManager) getSystemService(NOTIFICATION_SERVICE);
    notificationManager.cancel(0);
     
    ((TextView)findViewById(R.id.sum)).setText(intent.getStringExtra("sum"));
   }


 @Override
 protected void onStop() {
  super.onStop();
  Log.i("onStop","onStop");
 }
 
}

 

接下来的是一个计数service,当数据加1后会发个通知。

 

package com.qing.li;

import java.util.Timer;

import javax.security.auth.PrivateCredentialPermission;

import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.os.IBinder;
import android.util.Log;
/*
 * 通常在后台运行,即使activity关闭,service仍可执行
 */
public class CountingService extends Service {

 @Override
 public IBinder onBind(Intent arg0) {
  
  return null;
 }
 
 @Override
 public void onCreate() {
  
  Log.i("service","onCreate");
  IntentFilter filter =new IntentFilter ("com.qing.li.service");
  registerReceiver(receiver, filter);
  Timer timer =new Timer();//创建定时器实例
  timer.schedule(new CountingTask(this), 0, 10000); //每隔10秒执行一次任务
 }
 
 /*广播接收者*/
 private BroadcastReceiver receiver =new BroadcastReceiver() {
  
  @Override
  public void onReceive(Context context, Intent intent) {
   Log.i("receiver","receiver");


   //获得notificationManager对象
   NotificationManager notificationManager =(NotificationManager)
     getSystemService(context.NOTIFICATION_SERVICE);


   int icon =R.drawable.ic_launcher;//设置通知栏的图标
   CharSequence tickerText="timing";
   long when =System.currentTimeMillis();
   Intent intent2 =new Intent(context,TimingTaskActivity.class);
   intent2.putExtra("sum", intent.getStringExtra("sum"));


   PendingIntent pendingIntent =PendingIntent.getActivity
     (context, 0, intent2, PendingIntent.FLAG_CANCEL_CURRENT);
      CharSequence from ="qing";


      //实例化notification对象
   Notification notification = new Notification(icon, tickerText, when);
   notification.setLatestEventInfo(context, from,intent.getStringExtra("sum"), pendingIntent);
   notificationManager.notify(0, notification);//发送通知
   
  }
 };
 

}

以下是个任务类。

package com.qing.li;

import java.util.TimerTask;

import android.content.Context;
import android.content.Intent;
import android.util.Log;
/*
 * 计算的任务
 */
public class CountingTask extends TimerTask{
 private int sum =0;
 private Context context;
 public CountingTask(Context context) {
  this.context = context;
 }
 @Override
 public void run() {
  Log.i("counting","excuted");
  sum++;
  Intent intent =new Intent ("com.qing.li.service");
  intent.putExtra("sum", Integer.toString(sum));
  
  this.context.sendBroadcast(intent);//数据更新,发送广播
 }
 public int getSum() {
  return sum;
 }

}