在项目中遇到的一个要求:一段时间没有对屏幕进行操作就回到主页面(其实可以是任意页面)。
我的做法是
首先在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(); } }
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(); } }
这样就实现了一段时间没有操作跳转回主页面的功能。