android定时回到主页面

在项目中遇到的一个要求:一段时间没有对屏幕进行操作就回到主页面(其实可以是任意页面)。

我的做法是

首先在app一进来的时候就启动一个服务,在服务中计数,根据这和计数值判断是否跳转回主页面

其次需要写一个baseActivity配合这个服务,所有需要定时跳回到主页面的都继承这个baseActivity,在baseActivity中重写dispatchTouchEvent事件(这里为什么是dispatchTouchEvent而不是ontouchevent呢,因为dispatchTouchEvent是我们点击之后第一个调用的,而ontouchevent可能会被拦截,也很容易被子类拿来重写导致不执行baseactivity的ontouchevent事件的),在其中改变服务中的计数值。

最后要讲的就是跳转的方式,使用intent,注意要setflag(Intent.FLAG_ACTIVITY_CLEAR_TOP);意思是如果activity栈中如果存在我们要跳转的activity就将其上的所有activity都pop出activity栈,如果没有就加到栈顶,相当于activty加载模式的singleTask,接下来直接看代码:

public class BaseActivity extends Activity {

	public static boolean inNd;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		ViewUtils.inject(this);
		
		super.onCreate(savedInstanceState);
		SkipCallBack callback = new SkipCallBack() {
			
			@Override
			public void skip() {
				// TODO Auto-generated method stub
				Intent intent1 = new Intent(BaseActivity.this, PublicLockerMainActivity.class);
				intent1.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
				startActivity(intent1);
			}
		};
		SkipToMainService.setSkipCallBack(callback);
	}
	
	@Override
	protected void onResume() {
		inNd = true;
		super.onResume();
	}
	@Override
	public boolean dispatchTouchEvent(MotionEvent ev) {
		if(ev.getAction()==MotionEvent.ACTION_DOWN)
		{
			SkipToMainService.noActionTime = 0;			
		}
		return super.dispatchTouchEvent(ev);
	}
	
	@Override
	protected void onPause() {
		inNd = false;
		super.onPause();
	}
}

代码中的ViewUtils.inject(this);不用在意,是因为用了xutils框架,PublicLockerMainActivity.class就是我们要跳转去的页面


public class SkipToMainService extends Service {
	public static int noActionTime = 0;
	private boolean stopthread;
	private Thread th;
	final int SKIP = 1;
	public static SkipCallBack skipcallback;
	public static TimeoutCallBack callback;

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

	@Override
	public int onStartCommand(Intent intent, int flags, int startId) {
		noActionTime = 0;
		stopthread = false;
		th = null;
		th = new Thread(new Runnable() {
			@Override
			public void run() {
				while(true){
				while (!stopthread) {
					try {
						Thread.sleep(1000);
						if(BaseActivity.inNd){
							noActionTime++;
						}else{
							noActionTime = 0;
						}
						
						//Log.d("====", ""+noActionTime+" : "+ConfigManager.getAutoSkipTime());
						if (noActionTime >= ConfigManager.getAutoSkipTime()) {
							handler.sendEmptyMessage(SKIP);
							noActionTime = 0;
						}
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
				//
				}
				//stopSelf();
			}
		});
		th.start();
		return super.onStartCommand(intent, flags, startId);
	}

	/**
	 * 在主页面中停止服务,出了主页面开启服务
	 */
	Handler handler = new Handler() {
		public void handleMessage(android.os.Message msg) {
			switch (msg.what) {
			case SKIP:
				Log.d("====", "start skip");
				if(callback!=null){
					callback.Timeout();
				}
				Log.w("debug", "skip to main activity");
				/*Intent intent1 = new Intent(SkipToMainService.this, PublicLockerMainActivity.class);
				//intent1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
				intent1.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
				startActivity(intent1);*/
				BaseActivity.inNd = false;
				skipcallback.skip();
				break;

			default:
				break;
			}
		};
	};

	@Override
	public void onDestroy() {
		Log.d("====", "stop service");
		stopthread = true;
		SkipToMainService.callback = null;
		super.onDestroy();
	}

	public static void setTimeoutCallBack(TimeoutCallBack callback) {
		SkipToMainService.callback = callback;
	}
	
	public static void setSkipCallBack(SkipCallBack callback) {
		SkipToMainService.skipcallback = callback;
	}
	public interface TimeoutCallBack { 
		public  void Timeout();
	}
	public interface SkipCallBack { 
		public  void skip();
	}
}

这个服务会伴随应用一直存在,即使在跳转去的主页面也没有关闭,只是不再增加计数。服务在public class AppContext extends Application  中启动。

这样就实现了一段时间没有操作跳转回主页面的功能。


你可能感兴趣的:(android)