1. 程式人生 > >android Service+EventBus實現異地登入提示

android Service+EventBus實現異地登入提示

我是用retrofit做的網路介面,當異地登入時,errorbody資訊是固定資料(不能用公司的,隨便換個等效的)

{"error_state":1,"error_msg":"異地登入"}

然後我想是每個activity都有可能彈出資料,那麼怎麼保證每個都會彈出呢?難道每個介面都寫一次?太麻煩了。。。。
於是:在返回資料進行處理:

if(response.code()!=200 && response.errorbody()!=null){
    ErrorData data = new ErrorData();
    if(data.getError_state()
== 1){ EventBus.getDefault().post(new ShowLogoutDialog()); }
}

然後想用service處理,但service裡面沒有activity的引用,系統對話方塊又另外需要許可權怎麼辦呢?
於是在baseactivity獲取焦點的時候就更新service裡面的context:

 private boolean isFirst = true;
    @Override
    public final void onWindowFocusChanged(boolean hasFocus) {
        super
.onWindowFocusChanged(hasFocus); if (hasFocus && isFirst) { isFirst = false; EventBus.getDefault().post(this); } }
public class MyService extends Service {
    public class MyBinder extends Binder {

        public MyService getService(){
            return
MyService .this; } } private WeakReference<Context> weakContext; private MyBinder binder = new MyBinder(); @Override public void onCreate() { super.onCreate(); } @Override public int onStartCommand(Intent intent, int flags, int startId) { return super.onStartCommand(intent,flags,startId); } @Override public IBinder onBind(Intent intent) { EventBus.getDefault().register(this); return binder; } @Override public boolean onUnbind(Intent intent) { EventBus.getDefault().unregister(this); return false; } private HintDialog dialog; @Subscribe public void showExitDialog(ShowLogoutDialog event){ if(weakContext == null || weakContext.get() == null) return; if(dialog == null){ dialog = new HintDialog(weakContext.get()) .setMessage("檢測到當前賬號在其他裝置登入,請重新登入!") .setPositiveName("確定") .setPositiveListener(new View.OnClickListener() { @Override public void onClick(View v) { //關閉所有activity EventBus.getDefault().post(new CloseAllActivity()); Intent intent = new Intent(MyService.this, LoginActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); //設定登入狀態為false...這一步不寫了,讀者怎麼設的怎麼寫 startActivity(intent); stopSelf();//這句一定要,因為登入頁到主頁又會啟動服務 } }); dialog.setCancelable(false); } dialog.show(); } @Subscribe public void updateContext(Context context){ weakContext = new WeakReference<>(context); } }

總結:
原理:
1.在主頁註冊oncreate註冊service,當啟動新頁面或舊頁面重新啟用時,通過EventBus,service自動更新當前context,為了防止記憶體洩漏,所以用了weakReferences進行context儲存。

2.進行網路請求時,錯誤如果是異地登入,則要求service彈出dialog,因為之前EventBus設定的context已經是當前的context,所以service能夠根據網路請求的post正確彈出當前頁面dialog而不用使用系統對話方塊
3.對於這種每個頁面都要用的東西,採用公共服務類可以更加方便

ps:
在此期間,還做過一個網路請求到來時的等待框,但是最終沒有放到service中,因為下拉重新整理時,已經有了等待的提示,無需另外彈出提示,網路請求到來的提示可能會有多種,直接固定死將來也會有隱患。當然也可以根據不同的callback實現不同種類的請求,從而實現顯示和不顯示提示兩種效果,這一點留給讀者去思考。

相關推薦

android Service+EventBus實現異地登入提示

我是用retrofit做的網路介面,當異地登入時,errorbody資訊是固定資料(不能用公司的,隨便換個等效的) {"error_state":1,"error_msg":"異地登入"} 然後我想是每個activity都有可能彈出資料,那麼怎麼保證每個

Android與SQLite——實現簡單登入

基礎部分,具體步驟,沒有分層,是自己寫在印象筆記裡的,俗簡勿噴。 有些地方明白意思但是寫不好,全是自己的理解,專業名詞詞彙量不是很足,主要看程式碼吧。 搭建安卓專案就不廢話了,需要一個登入介面,介面的搭建可以從簡,通過兩個EditText和一個Button即可,登入成功後可

Android客戶端實現註冊/登入詳解(二)

上文中介紹了安卓客戶端與伺服器互動,實現註冊功能 本文將繼續介紹App與伺服器的互動實現登入和自動登入的功能,上文說到請求伺服器進行註冊主要是通過POST請求攜帶引數實現,起作用的程式碼主要是 StringRequest request=new

Android使用SharedPreferences實現自動登入

今天完善了自己app的登入介面,主要就是添加了記住密碼和自動登入的功能,記錄一下怎麼利用輕量級的儲存SharedPreferences來實現這兩個功能。 先說一下SharedPreferences介紹: SharedPreferences是Android平臺上一個輕量級的儲

Android客戶端實現註冊/登入詳解(一)

前言 我們在開發安卓App時難免要與伺服器打交道,尤其是對於使用者賬號資訊的註冊與登入更是每個android開發人員必須掌握的技能,本文將對客戶端的註冊/登入功能的實現進行分析,不到之處還請指出。 在這裡我們僅討論客戶端如何請求伺服器進行註冊,而伺服器在

android + tomcat + eclipse實現登入

客戶端開發平臺:Android studio( sdk版本26 ,模擬器 Android7.0) 伺服器開發平臺:eclipse+tomcat* 服務端 1.新建名為login_server的動態web專案(注意勾選自動新增web.xml配置檔案) 2.在專案Java目錄中新建包:m

Android使用MVP實現登入註冊

一.定義一個類(以下用到的介面) public class API { public static final String LOGIN_URL = "http://www.zhaoapi.cn/user/login";//登入介面 public

Android--使用顯式Intent,實現登入介面到註冊介面的跳轉

//Activity_abaka.xml --------------註冊介面 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://sch

android Service重啟問題,結合AlarmManager實現定時任務

         當啟動service進行後臺任務的時候,我們一般的 做法是啟動一個執行緒,然後通過sleep方法來控制進行定時的任務,如輪詢操作,訊息推送。這種service的資源是很容易被回收的,雖然service的優先順序很高,但是還沒有前臺的activity的優

Android Service,AlarmManager組合實現定時任務踩的坑

做專案時遇到一個場景:app需要定時訪問後臺,感知獲取登入使用者有沒有最新的訊息。 我採用了定義一個Service,在onStartCommand()方法中請求後臺獲取最新訊息,接著建立一個AlarmManager來延時傳送廣播,再定義一個廣播接收器,接收到一

Android實現Line登入分享

  一、獲取引數 1、註冊登入Line開發者賬號 在Line官網並找不到註冊地方,可以通過Line APP進行註冊,註冊之後進入Line開發者官網:https://developers.line.me/en/進行開發者賬號授權。 2、建立應用 3、建立完成在Channe

Android實現Twitter登入分享

Twitter  一、註冊獲取引數 1、進入Twitter開發者網站註冊賬號https://developer.twitter.com/ 2、新建一個專案,就按照提示填寫就行(提示:儘量填的“委婉”點,不然可能稽核過不了); 3、建立應用 括號代表必填  ti

android用SharedPreferences實現登入時記住密碼功能

import android.content.Intent;import android.content.SharedPreferences;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import andr

Android 記住密碼和自動登入介面的實現(SharedPreferences 的用法)

SharedPreferences介紹: SharedPreferences是Android平臺上一個輕量級的儲存類,主要是儲存一些常用的配置引數,它是採用xml檔案存放資料的,檔案存放在"/data/data<package name>/shared_pref

Android使用SharedPreferences實現登入帳號和密碼的儲存方法簡介

先來看看程式執行圖: 1.使用者未輸入狀態: 2.使用者單擊記住密碼: 3.使用者單擊讀取密碼: 接下來我們來看實現程式碼: import android.content.Context; import android.content.SharedPreference

Android基礎筆記——HttpURLConnection實現使用者登入

現在提到“神經網路”和“深度神經網路”,會覺得兩者沒有什麼區別,神經網路還能不是“深度”(deep)的嗎?我們常用的 Logistic regression 就可以認為是一個不含隱含層的輸出層啟用函式用 sigmoid(logistic) 的神經網路,顯然 Logistic

Android專案開發筆記之登入註冊模組實現(客戶端+服務端)

寫在前面   斷斷續續開發了幾個月的App終於告一段落,雖然它可能還很不完美,不過作為上手Android的第一個完整專案,確實從中學到了蠻多,所以開個系列記錄一下~本篇先從基本上每個App都會有的登入註冊講起,包含自動登入、記住密碼功能的實現=w= 實現

android系統設定裡的觸控提示音功能怎樣實現開啟和關閉?

最近做一個app,涉及系統觸控提示音的開啟和關閉。以下為相關程式碼片段:@Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { Settings.Syst

淺談Android記憶體洩漏&&實現殺不死的無介面後臺Service

以前看大神的部落格,都說沒有碰到過記憶體洩漏或者OOM就不算真正的搞過Android…以前我覺得這事離我還好遠…. 沒想到,這次真的是遇上了!! 專案需求是這樣的:app開機自啟,啟動之後app就一直在run,是一直run!(開機自啟,現在大概也就只有在AR

安卓Android本地Sqlite實現註冊賬號和登入功能

實現了註冊賬號時將資料寫入本地SQLite,登入賬號時從本地SQLite匹配資料,並有記住密碼功能,以及通過改密口令(類似於密保問題)修改密碼的功能 思路很簡單,登入賬號的時候,先去資料庫匹配賬號,如果匹配到了相同賬號,再去匹配同一行的密碼,匹配成功則登入成功,匹配不成功則