android使用廣播實(shí)現(xiàn)強(qiáng)制下線功能

強(qiáng)制下線是我們常見的功能,比如QQ在別處登錄了魏割,就會(huì)將你強(qiáng)制擠下線譬嚣。思路是在界面上添加一個(gè)對話框,讓用戶無法進(jìn)行其他操作见妒,而且對話框只有“確定”按鈕孤荣,然后回到登錄界面即可。強(qiáng)制下線的功能需要關(guān)閉所有的activity须揣,我們可以用之前創(chuàng)建的基類BaseActivity和ActivityColletor來協(xié)助實(shí)現(xiàn)該功能
一、創(chuàng)建LoginActivity作為登錄界面钱豁,布局文件如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">
<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="60dp">
    <TextView
        android:layout_width="90dp"
        android:layout_height="match_parent"
        android:gravity="center"
        android:textSize="18sp"
        android:text="用戶名"/>
    <EditText
        android:id="@+id/accountEdit"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:hint="請輸入用戶名"
        android:layout_gravity="center_horizontal"/>
</LinearLayout>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="60dp">
        <TextView
            android:layout_width="90dp"
            android:layout_height="match_parent"
            android:gravity="center"
            android:textSize="18sp"
            android:text="密碼"/>
        <EditText
            android:id="@+id/pwdEdit"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:hint="請輸入密碼"
            android:layout_gravity="center_horizontal"/>
    </LinearLayout>
    <Button
        android:id="@+id/login"
        android:text="登錄"
        android:layout_width="200dp"
        android:layout_height="60dp"
        android:layout_gravity="center_horizontal"/>
</LinearLayout>

LoginActivity中的代碼如下:

class LoginAcitivity:BaseActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        setContentView(R.layout.activity_login)

        login.setOnClickListener {
            val account=accountEdit.text.toString()
            val pwd=pwdEdit.text.toString()

            //如果賬號(hào)為admin耻卡,密碼為123456 就認(rèn)為登錄成功
            if (account=="admin"&&pwd=="123456"){
                val initent=Intent(this,MainActivity::class.java)
                startActivity(initent)
                finish()
            }else{
                Toast.makeText(this,"賬號(hào)或者密碼錯(cuò)誤",Toast.LENGTH_LONG).show()
            }
        }
    }
}

二、創(chuàng)建MainActivity牲尺,該頁面是登錄成功之后的主界面
xml代碼如下:

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
    android:layout_height="match_parent">
<Button
    android:id="@+id/forceoffline"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="強(qiáng)制下線"/>
</LinearLayout>

MainActivity中的代碼如下:

class MainActivity:BaseActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
         forceoffline.setOnClickListener {
             val intent=Intent("com.app.activitytest.broadcast.FORCE_OFFLINE")
             sendBroadcast(intent)
         }
    }
}

這里我們廣播的值”com.app.activitytest.broadcast.FORCE_OFFLINE“卵酪,這條廣播就是通知用戶強(qiáng)制下線的,強(qiáng)制用戶下線的邏輯并不在這里谤碳,而是應(yīng)該在接收廣播的BroadcastReceiver里面溃卡,這樣強(qiáng)制下線的功能就不會(huì)依附在程序的任何界面了,只有發(fā)出這一條廣播蜒简,就可以完成用戶強(qiáng)制下線了瘸羡。
我們創(chuàng)建的BroadcastReceiver需要彈出一個(gè)對話框來阻塞用戶的正常操作,但是創(chuàng)建一個(gè)靜態(tài)注冊的BroadcastReceiver搓茬,是沒有辦法在onReceive方法里彈出對話框這樣的UI控件的犹赖,而顯然我們也不能在每一個(gè)activity中都注冊一個(gè)動(dòng)態(tài)的BroadcastReceiver队他。那么我們需要怎么辦呢?其實(shí)只需要在BaseActivity中動(dòng)態(tài)注冊一個(gè)BroadcastReceiver就可以了峻村,因?yàn)樗械腁ctivity都繼承自BaseActivity
修改BaseActivity代碼:

open class BaseActivity :AppCompatActivity() {
    val TAG="BaseActivity"
    lateinit var receiver:ForceOfflineReceiver

    /**
     * 在onCreat()方法中調(diào)用ActivityCollector的addActivity()方法麸折,
     * 表明當(dāng)前正在創(chuàng)建的activity添加到集合里,
     */
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        Log.d(TAG, "onCreate: "+javaClass.simpleName)
        ActivityCollector.addAcivity(this)
    }

    override fun onResume() {
        super.onResume()

        val intentFilter=IntentFilter()
        intentFilter.addAction("com.app.activitytest.broadcast.FORCE_OFFLINE")
        receiver=ForceOfflineReceiver()
        registerReceiver(receiver,intentFilter)
    }

    override fun onPause() {
        super.onPause()
        unregisterReceiver(receiver)
    }
    /**
     * 在onDestroy()方法中使用ActivityCollector.removeActivity()方法粘昨,
     * 表明從集合里移除一個(gè)馬上要銷毀的activity
     */
    override fun onDestroy() {
        super.onDestroy()
        ActivityCollector.removeActivity(this)

    }

    inner class ForceOfflineReceiver:BroadcastReceiver(){
        override fun onReceive(context: Context?, intent: Intent?) {
            if (context != null) {
                AlertDialog.Builder(context).apply {
                    setTitle("警告")
                    setMessage("你被強(qiáng)制退出垢啼,請嘗試重寫登錄")
                    setCancelable(false)
                    setPositiveButton("確定"){_,_->
                        ActivityCollector.finishAll()
                        val intent=Intent(context,LoginAcitivity::class.java)
                        context.startActivity(intent)

                    }
                    show()
                }
            }
        }

    }
}

我們來看一下forceOfflineReceiver中的代碼,這次代碼中的使用了AlertDialog.Builder構(gòu)建的對話框张肾,注意這里一定要設(shè)置setCancelable()方法為不可取消膊夹,否則用戶按一下Back鍵就可以關(guān)閉對話框繼續(xù)使用程序了。然后使用setPositiveButton()方法來給對話框注冊確定按鈕捌浩,當(dāng)用戶點(diǎn)擊了確定之后放刨,就調(diào)用了ActivityCollector的finishAll()方法,銷毀了所以的activity尸饺,并且重新啟動(dòng)LoginActivity进统。
forceOfflineReceiver這個(gè)BroadcastReceiver是怎么注冊的,這里重寫了onResumne()方法和onPause()方法浪听,然后分別在這倆個(gè)方法中注冊和取消螟碎。原因是我們始終需要處于棧頂?shù)腁ctivity才能接收到這條強(qiáng)制下線的廣播,非棧頂?shù)腶ctivity沒有必要接受這條廣播迹栓。當(dāng)一個(gè)activity失去棧頂?shù)奈恢玫臅r(shí)候就會(huì)自動(dòng)取消BroadcastReceiver的注冊

三掉分、mainfest文件中的注冊:

    <activity
            android:name=".LoginAcitivity"
            android:label="First app">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <activity android:name=".MainActivity"/>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市克伊,隨后出現(xiàn)的幾起案子酥郭,更是在濱河造成了極大的恐慌,老刑警劉巖愿吹,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件不从,死亡現(xiàn)場離奇詭異,居然都是意外死亡犁跪,警方通過查閱死者的電腦和手機(jī)椿息,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來坷衍,“玉大人寝优,你說我怎么就攤上這事》愣” “怎么了乏矾?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我妻熊,道長夸浅,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任扔役,我火速辦了婚禮帆喇,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘亿胸。我一直安慰自己坯钦,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布侈玄。 她就那樣靜靜地躺著婉刀,像睡著了一般。 火紅的嫁衣襯著肌膚如雪序仙。 梳的紋絲不亂的頭發(fā)上突颊,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天,我揣著相機(jī)與錄音潘悼,去河邊找鬼律秃。 笑死,一個(gè)胖子當(dāng)著我的面吹牛治唤,可吹牛的內(nèi)容都是我干的棒动。 我是一名探鬼主播,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼宾添,長吁一口氣:“原來是場噩夢啊……” “哼船惨!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起缕陕,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤粱锐,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后榄檬,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體卜范,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年鹿榜,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片锦爵。...
    茶點(diǎn)故事閱讀 38,654評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡舱殿,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出险掀,到底是詐尸還是另有隱情沪袭,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布樟氢,位于F島的核電站冈绊,受9級特大地震影響侠鳄,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜死宣,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一伟恶、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧毅该,春花似錦博秫、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至朴爬,卻和暖如春即寒,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背召噩。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工母赵, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蚣常。 一個(gè)月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓市咽,卻偏偏與公主長得像,于是被迫代替她去往敵國和親抵蚊。 傳聞我的和親對象是個(gè)殘疾皇子施绎,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,543評論 2 349

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