Android定时广播和定时服务两种实现方式

几种方式的对面及介绍看这里

http://blog.csdn.net/u014492609/article/details/51475254


自己写了个Demo来实现定时发送广播和定时执行服务




地址https://github.com/wds1181977/TimerBroadcastReceiver-Service.git


package com.example.h2;

import android.app.Activity;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.SystemClock;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity {

	// private TimerService mTimerService;
	private final String MESSAGE = "message";// 时间到后接受消息
	private Context mContext;
	private TextView tv, tv2;
	private Button bt1, bt2, bt3, bt4, bt5, bt6,bt7;
	private final int Time = 5 * 1000;// 约定每隔5秒执行一次
	private boolean isHanderType = false;
	private static final String ACTION_NAME = "android.intent.action.alarm.timer";// 广播名称
	private static final String ACTION_NAME2 = "android.intent.action.handler.timer";// 广播名称
	private int countHandler = 1;// handler发送次数计数
	private int countAlarm = 0;// alarm发送次数计数
	// Handler方式发送
	Handler handler = new Handler();
	Runnable runnable = new Runnable() {
		@Override
		public void run() {
			// TODO Auto-generated method stub

			handler.postDelayed(runnable, Time);

			Intent mIntent = new Intent(ACTION_NAME2);

			// 发送广播
			mIntent.putExtra(MESSAGE, "第" + countHandler + "次"
					+ "Handler方式发送过来的广播,  我将带头冲锋" + countHandler + "次");

			sendBroadcast(mIntent);

		}
	};

	Runnable runnable2 = new Runnable() {
		@Override
		public void run() {
			// TODO Auto-generated method stub
			Intent intent = new Intent(mContext, TimerService.class);
			startService(intent);
			handler.postDelayed(runnable2, Time);

		}
	};

	private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
		@Override
		public void onReceive(Context context, Intent intent) {
			String action = intent.getAction();
			String message = intent.getStringExtra(MESSAGE);

			if (action.equals(ACTION_NAME)) {

				tv.setText("第" + countAlarm + "次"
						+ "AlarmManager方式发送过来的广播,  是时候表演真正的第" + countAlarm
						+ "次技术了");

				tv2.setText("和Handler广播不一样,Alarm是首先执行一次,五秒后在在执行第二次,并且发送时只执行一次");
				// Toast.makeText(MainActivity.this, message+countAlarm,
				// 0).show();
				countAlarm++;
			} else if (action.equals(ACTION_NAME2)) {

				if (!TextUtils.isEmpty(message)) {
					tv2.setText(message);
				}

				countHandler++;

			}

		}

	};

	// ServiceConnection conn = new ServiceConnection() {
	// @Override
	// public void onServiceDisconnected(ComponentName name) {
	//
	// }
	//
	// @Override
	// public void onServiceConnected(ComponentName name, IBinder service) {
	// // TODO Auto-generated method stub
	// mTimerService = ((TimerService.MsgBinder)service).getService();
	// tv.setText(mTimerService.getMessage());
	//
	//
	// }
	//
	//
	//
	//
	// };

	@Override
	protected void onResume() {
		// TODO Auto-generated method stub
		super.onResume();
		// 注册广播
		registerBoradcastReceiver();

	}

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		setContentView(R.layout.activity_main);
		mContext = MainActivity.this;
		tv = (TextView) findViewById(R.id.textView1);
		tv2 = (TextView) findViewById(R.id.textView2);
		bt1 = (Button) findViewById(R.id.button1);
		bt2 = (Button) findViewById(R.id.button2);

		bt3 = (Button) findViewById(R.id.button3);
		bt4 = (Button) findViewById(R.id.button4);
		bt5 = (Button) findViewById(R.id.button5);

		bt6 = (Button) findViewById(R.id.button6);

		bt7 = (Button) findViewById(R.id.button7);
		bt1.setOnClickListener(onClickListener);
		bt2.setOnClickListener(onClickListener);
		bt3.setOnClickListener(onClickListener);
		bt4.setOnClickListener(onClickListener);
		bt5.setOnClickListener(onClickListener);
		bt6.setOnClickListener(onClickListener);
		bt7.setOnClickListener(onClickListener);

	}

	View.OnClickListener onClickListener = new OnClickListener() {

		@Override
		public void onClick(View v) {
			// TODO Auto-generated method stub
			switch (v.getId()) {
			case R.id.button1:
				sendTimerBoaadCastReceiver(true,-1);
				bt1.setEnabled(false);
				break;
			case R.id.button2:
				sendTimerBoaadCastReceiver(false,2);
				bt2.setEnabled(false);
				break;
			case R.id.button3:
				sendTimerService(true);
				bt3.setEnabled(false);
				break;
			case R.id.button4:
				sendTimerService(false);
				bt4.setEnabled(false);
				break;
			case R.id.button5:
				cancelAlLBR();
				break;
			case R.id.button6:
				cancelAlLService();
				break;
			case R.id.button7:
				sendTimerBoaadCastReceiver(false,1);
				bt7.setEnabled(false);
				break;

			}

		}
	};

	// 注册广播

	private void registerBoradcastReceiver() {

		IntentFilter myIntentFilter = new IntentFilter();
		myIntentFilter.addAction(ACTION_NAME);
		myIntentFilter.addAction(ACTION_NAME2);

		// 注册广播
		registerReceiver(mBroadcastReceiver, myIntentFilter);

	}

	// 发送定时广播

	/**
	 * android提供了四种类型的闹钟: ELAPSED_REALTIME 在指定的延时过后,发送广播,但不唤醒设备。
	 * 
	 * ELAPSED_REALTIME_WAKEUP
	 * 在指定的演示后,发送广播,并唤醒设备延时是要把系统启动的时间SystemClock.
	 * elapsedRealtime()算进去的,具体用法看代码。
	 * 
	 * 
	 * RTC 在指定的时刻,发送广播,但不唤醒设备
	 * 
	 * RTC_WAKEUP 在指定的时刻,发送广播,并唤醒设备
	 * 
	 * 
	 * AlarmManager提供的方法: void set(int type, long
	 * triggerAtTime,PendingIntent operation) 设置一个闹钟
	 * 
	 * 
	 * void setRepeating(int type, long triggerAtTime, long
	 * interval,PendingIntent operation) 设置一个会重复的闹钟
	 * 
	 * 
	 * void setInexactRepeating(int type, long triggerAtTime,
	 * longinterval, PendingIntent operation)
	 * 
	 * 
	 * 
	 * 
	 * 
	 * 
	 */
	private void sendTimerBoaadCastReceiver(boolean isHandler, int state) {
		if (isHandler) {
			// Handler方式
			handler.postDelayed(runnable, Time);// 每Time秒执行一次runnable.
		} else {

			Intent mIntent = new Intent(ACTION_NAME);
			// 发送广播

			// 和Handler定时广播不同这里只执行一次,执行多次的是接受到广播消息,所以这里没用
			// mIntent.putExtra(MESSAGE,
			// "第"+countAlarm+"次"+"AlarmManager方式发送过来的广播,  是时候表演真正的第"+countAlarm+"次技术了");
			Toast.makeText(MainActivity.this, "发送Alarm广播,全军出击", 0).show();
			// AlarmManager方式发送广播
			sendBroadcast(mIntent);
			// 触发服务的起始时间 这里是// 5秒后发送广播,只发送一次

			PendingIntent pendIntent = PendingIntent.getBroadcast(mContext, 0,
					mIntent, PendingIntent.FLAG_UPDATE_CURRENT);

			// 进行闹铃注册
			AlarmManager manager = (AlarmManager) getSystemService(ALARM_SERVICE);


			switch (state) {

			case 1:
				/**
				 * 5秒后发送广播,只发送一次 elapsedRealtime() and elapsedRealtimeNanos()
				 * 返回系统启动到现在的时间,包含设备深度休眠的时间。该时钟被保证是单调的,
				 * 即使CPU在省电模式下,该时间也会继续计时。该时钟可以被使用在当测量时间间隔可能跨越系统睡眠的时间段。
				 * 
				 */
				long triggerAtTime = SystemClock.elapsedRealtime() + Time;
				manager.set(AlarmManager.ELAPSED_REALTIME, triggerAtTime,
						pendIntent);
				break;
			case 2:
				// 每隔5秒重复发广播
				manager.setInexactRepeating(
						AlarmManager.ELAPSED_REALTIME_WAKEUP,
						SystemClock.elapsedRealtime(), Time, pendIntent);
				break;
			case 3:
				break;
			case 4:
				break;

			}

		}

	}

	// 取消Handler广播
	private void cancelHandlerBR() {

		handler.removeCallbacks(runnable);
		countHandler = 1;
		tv2.setText("敌军还有5秒到达战场,碾碎他们");

	}

	// 取消Alarm广播
	private void cancelAlarmManagerBR() {
		Intent mIntent = new Intent(ACTION_NAME);

		PendingIntent pendIntent = PendingIntent.getBroadcast(mContext, 0,
				mIntent, 0);
		// 与上面的intent匹配(filterEquals(intent))的闹钟会被取消

		// 进行闹铃取消
		AlarmManager manager = (AlarmManager) getSystemService(ALARM_SERVICE);
		manager.cancel(pendIntent);

		countAlarm = 0;
		tv.setText("敌军还有5秒到达战场,碾碎他们");

	}

	private void cancelAlLBR() {

		cancelHandlerBR();
		cancelAlarmManagerBR();
		bt1.setEnabled(true);
		bt2.setEnabled(true);
		bt7.setEnabled(true);

	}

	private void cancelAlLService() {
		handler.removeCallbacks(runnable2);
		ServiceUtil.cancleAMServicer(mContext);
		ServiceUtil.stopHandlerService(mContext);

		bt3.setEnabled(true);
		bt4.setEnabled(true);
		bt6.setEnabled(true);
	
		tv.setText("敌军还有5秒到达战场,碾碎他们");
		tv2.setText("敌军还有5秒到达战场,碾碎他们");

	}

	// 发送定时服务

	private void sendTimerService(boolean isHandler) {

		if (isHandler) {
			handler.postDelayed(runnable2, Time);// 每Time秒执行一次runnable.

		} else {
			ServiceUtil.startAMService(mContext);

		}

	}

	@Override
	protected void onDestroy() {
		// TODO Auto-generated method stub
		super.onDestroy();
		cancelAlLBR();
		cancelAlLService();
		// unbindService(conn);
		unregisterReceiver(mBroadcastReceiver);
	}

	@Override
	protected void onPause() {
		// TODO Auto-generated method stub
		super.onPause();

	}

}


服务类


package com.example.h2;

import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.util.Log;
import android.widget.Toast;


/**
 * Created by coder80 on 2016/3/31.
 */
public class TimerService extends Service{
    private String TAG = TimerService.class.getSimpleName();

	String message;
	int count=1;

    
    @Override
    public void onCreate() {
        super.onCreate();
        sendMessage();
    }
    
    @Override
    public void onDestroy() {
        super.onDestroy();
        count=1;
        Log.i(TAG, "UploadPOIService onDestroy here.... ");
    }

    private void sendMessage() {
    	//simulation HTTP request to server 
//        count++;
//    	message="第"+count+"次"+"执行定时服务, 真是个深思熟虑的选择";
       	Toast.makeText(getApplicationContext(), "执行定时服务, 真是个深思熟虑的选择", 0).show();
       	stopSelf();
    }
    
	public String  getMessage(){
		
		return message;
	}

	@Override
	public IBinder onBind(Intent intent) {
		// TODO Auto-generated method stub
		return null;
	}

//	/**
//	 * 返回一个Binder对象
//	 */
//	@Override
//	public IBinder onBind(Intent intent) {
//		return new MsgBinder();
//	}
//	
//	public class MsgBinder extends Binder{
//		/**
//		 * 获取当前Service的实例
//		 * @return
//		 */
//		public TimerService getService(){
//			return TimerService.this;
//		}
//	}



}


服务工具类

package com.example.h2;

import android.app.Activity;
import android.app.ActivityManager;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.util.Log;

import java.util.List;


/**
 * Created by coder80 on 2014/10/31.
 */

public class ServiceUtil {
    private final static String ServiceName="com.example.h2.TimerService";
    public static boolean isServiceRunning(Context context, String className) {
        boolean isRunning = false;
        
        ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
        List<ActivityManager.RunningServiceInfo> serviceInfos = activityManager.getRunningServices(50);

        if(null == serviceInfos || serviceInfos.size() < 1) {
            return false;
        }

        for(int i = 0; i < serviceInfos.size(); i++) {
            if(serviceInfos.get(i).service.getClassName().contains(className)) {
                isRunning = true;
                break;
            }
        }
        Log.i("ServiceUtil-AlarmManager", className + " isRunning =  " + isRunning);
        return isRunning;
    }
;
    public static void startAMService(Context context){
        Log.i("ServiceUtil-AlarmManager", "invokeTimerPOIService wac called.." );
        PendingIntent alarmSender = null;
        Intent startIntent = new Intent(context, TimerService.class);
        startIntent.setAction(ServiceName);




        try {
    
            alarmSender = PendingIntent.getService(context, 0, startIntent, 0);
        } catch (Exception e) {
            Log.i("ServiceUtil-AlarmManager", "failed to start " + e.toString());
        }
        AlarmManager am = (AlarmManager) context.getSystemService(Activity.ALARM_SERVICE);
        am.setInexactRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 5*1000, alarmSender);
    }

    public static void cancleAMServicer(Context context){
        Log.i("ServiceUtil-AlarmManager", "cancleAlarmManager to start ");
        Intent intent = new Intent(context,TimerService.class);
    	intent.setAction(ServiceName);
        PendingIntent pendingIntent=PendingIntent.getService(context, 0, intent,PendingIntent.FLAG_UPDATE_CURRENT);
        AlarmManager alarm=(AlarmManager)context.getSystemService(Activity.ALARM_SERVICE);
        alarm.cancel(pendingIntent);
    }
    
    
    
    //启动service 方式2  
    //  
    public static void startHandlerService(Context cxt){  
        Intent intent = new Intent(cxt,TimerService.class);  

        cxt.startService(intent);
    }  
      
    public  static void stopHandlerService(Context cxt){  
        Intent intent = new Intent(cxt,TimerService.class);  
 
        cxt.stopService(intent);
    }  
}




  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值