Android如何在應(yīng)用程序一段時間無操作后做一些事情(退出登錄)

項目中遇到一個需求撤嫩,程序在一段時間沒有操作的情況下退出登錄女责,以此作為隨筆記憶膘流。

  • 原理:在BaseActivity中重寫dispatchTouchEvent方法盔夜,在MotionEvent.ACTION_UP事件中利用Handler發(fā)送一個延時消息,在MotionEvent.ACTION_DOWN事件中清空Handler消息隊列瘫筐,然后所有的Activity繼承BaseActivity蜜暑。

  • 下面貼出BaseActivity代碼:

      /**
       * Created by 一位不愿透露自己姓氏的先生 on 2017/8/23.
       */
    
          public class BaseActivity extends AppCompatActivity {
          
              @Override
              protected void onCreate(@Nullable Bundle savedInstanceState) {
                  super.onCreate(savedInstanceState);
                  startAD();
              }
          
              private Handler handler = new Handler();
              private long time = 1000 * 5;
          
              @Override
              public boolean dispatchTouchEvent(MotionEvent event) {
                  switch (event.getAction()) {
                      case MotionEvent.ACTION_DOWN:
                          handler.removeCallbacks(runnable);
                          break;
                      case MotionEvent.ACTION_UP:
                          startAD();
                          break;
                  }
                  return super.dispatchTouchEvent(event);
              }
          
              private Runnable runnable = new Runnable() {
                  @Override
                  public void run() {
                      PrefUtils.setBoolean(BaseActivity.this, "isLogin", false);
                      AlertDialog.Builder builder = new AlertDialog.Builder(BaseActivity.this);
                      builder.setTitle("溫馨提示")
                              .setCancelable(false)
                              .setMessage("當(dāng)前登錄已失效,請重新登錄")
                              .setPositiveButton("確定", new DialogInterface.OnClickListener() {
                                  @Override
                                  public void onClick(DialogInterface dialogInterface, int i) {
                                      Intent intent = new Intent();
                                      intent.setClass(BaseActivity.this, LoginActivity.class);
                                      startActivity(intent);
                                  }
                              });
                      AlertDialog alertDialog = builder.create();
                      alertDialog.show();
                  }
              };
          
              public void startAD() {
                  handler.removeCallbacks(runnable);
                  handler.postDelayed(runnable, time);
              }
          
          
              @Override
              protected void onDestroy() {
                  super.onDestroy();
              }
          }
    
  • 如果僅僅是這樣是不能滿足我們的需求的策肝,例如我從MainActivity 跳到A Actiity的時候我不會將MainActivity銷毀肛捍,那么當(dāng)我在A Activity中長時間沒有操作跳到登錄頁面登錄之后再重新打開MainActivity的時候就會出問題隐绵,這個時候我們需要將所有打開的Activity全部關(guān)閉

  • 解決方法:自定義一個Application,定義一個集合用來存放所有Actiity的實例,當(dāng)我們需要退出的時候調(diào)用集合依次執(zhí)行finish()拙毫;

  • 下面貼出Application代碼:

      /**
       * Created by 一位不愿透露自己姓氏的先生 on 2017/4/24.
       */
      
      public class DemoAppLication extends Application {
          private static DemoAppLication mycontext;
          private ArrayList<Activity> list;
      
          @Override
          public void onCreate() {
              super.onCreate();
              list = new ArrayList<>();
      
          }
      
          public void AddActivity(Activity activity) {
      
              list.add(activity);
      
          }
      
          public void exit() {
              try {
                  for (Activity activity : list) {
                      if (activity != null)
                          activity.finish();
                  }
              } catch (Exception e) {
                  e.printStackTrace();
              }
          }
      
      }
    
  • 然后在BaseActivity獲取Application的實例并保存代碼修改如下:

      /**
       * Created by 一位不愿透露自己姓氏的先生 on 2017/8/23.
       */
      
      public class BaseActivity extends AppCompatActivity {
    
    
      public MiaoHuAppLication application;
    
      @Override
      protected void onCreate(@Nullable Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          application = (DemoLication) getApplication();
          startAD();
      }
    
      private Handler handler = new Handler();
      private long time = 1000 * 5;
    
           @Override
          public boolean dispatchTouchEvent(MotionEvent event) {
              switch (event.getAction()) {
                  case MotionEvent.ACTION_DOWN:
                      handler.removeCallbacks(runnable);
                      break;
                  case MotionEvent.ACTION_UP:
                      startAD();
                      break;
              }
              return super.dispatchTouchEvent(event);
          }
          
      private Runnable runnable = new Runnable() {
          @Override
          public void run() {
              PrefUtils.setBoolean(BaseActivity.this, "isLogin", false);
              AlertDialog.Builder builder = new AlertDialog.Builder(BaseActivity.this);
              builder.setTitle("溫馨提示")
                      .setCancelable(false)
                      .setMessage("當(dāng)前登錄已失效依许,請重新登錄")
                      .setPositiveButton("確定", new DialogInterface.OnClickListener() {
                          @Override
                          public void onClick(DialogInterface dialogInterface, int i) {
                              Intent intent = new Intent();
                              intent.setClass(BaseActivity.this, LoginActivity.class);
                              startActivity(intent);
                              IMMessage.stop();
                              application.exit();
                          }
                      });
              AlertDialog alertDialog = builder.create();
              alertDialog.show();
          }
      };
    
      public void startAD() {
          handler.removeCallbacks(runnable);
          handler.postDelayed(runnable, time);
      }
    
    
      @Override
      protected void onDestroy() {
          super.onDestroy();
      }
      }
    
  • 最后在每一個Activity中調(diào)用如下代碼:

      application.AddActivity(this);
    
  • 然后在需要關(guān)閉Activity的地方調(diào)用如下代碼:

      application.exit();
    

不足之處還請各路大牛指點。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末缀蹄,一起剝皮案震驚了整個濱河市峭跳,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌缺前,老刑警劉巖蛀醉,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異衅码,居然都是意外死亡拯刁,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進(jìn)店門肆良,熙熙樓的掌柜王于貴愁眉苦臉地迎上來筛璧,“玉大人,你說我怎么就攤上這事惹恃∝舶” “怎么了?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵巫糙,是天一觀的道長朗儒。 經(jīng)常有香客問我,道長参淹,這世上最難降的妖魔是什么醉锄? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮浙值,結(jié)果婚禮上恳不,老公的妹妹穿的比我還像新娘。我一直安慰自己开呐,他們只是感情好烟勋,可當(dāng)我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著筐付,像睡著了一般卵惦。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上瓦戚,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天沮尿,我揣著相機與錄音,去河邊找鬼较解。 笑死畜疾,一個胖子當(dāng)著我的面吹牛赴邻,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播庸疾,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼乍楚,長吁一口氣:“原來是場噩夢啊……” “哼当编!你這毒婦竟也來了届慈?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤忿偷,失蹤者是張志新(化名)和其女友劉穎金顿,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鲤桥,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡揍拆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了茶凳。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嫂拴。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖贮喧,靈堂內(nèi)的尸體忽然破棺而出筒狠,到底是詐尸還是另有隱情,我是刑警寧澤箱沦,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布辩恼,位于F島的核電站,受9級特大地震影響谓形,放射性物質(zhì)發(fā)生泄漏灶伊。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一寒跳、第九天 我趴在偏房一處隱蔽的房頂上張望聘萨。 院中可真熱鬧,春花似錦童太、人聲如沸米辐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽儡循。三九已至,卻和暖如春征冷,著一層夾襖步出監(jiān)牢的瞬間择膝,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工检激, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留肴捉,地道東北人腹侣。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像齿穗,于是被迫代替她去往敵國和親傲隶。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內(nèi)容