跳至主要内容

使用广播实现强制下线功能

ActivityCollector.kt --->

package com.example.fredric.broadcastloginout

import android.app.Activity

class ActivityCollector {
    companion object {
        val activities = ArrayList<Activity>()

        fun addActivity(activity: Activity) {
            activities.add(activity)
        }

        fun removeActivity(activity: Activity) {
            activities.remove(activity)
        }

        fun finishAll() {
            for(activity in activities) {
                if(!activity.isFinishing) {
                    activity.finish()
                }
            }
        }
    }
}



BaseActivity.kt --->

package com.example.fredric.broadcastloginout

import android.app.AlertDialog
import android.content.*
import android.os.Bundle
import android.support.v7.app.AppCompatActivity

open class BaseActivity : AppCompatActivity() {

    var receiver: ForceOfflineReceiver? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        ActivityCollector.addActivity(this)
    }

    override fun onDestroy() {
        super.onDestroy()
        ActivityCollector.removeActivity(this)
    }


    override fun onResume() {
        super.onResume()
        var intentFilter = IntentFilter()
        intentFilter.addAction("com.example.broadcastbestpractice.FORCE_OFFLINE")
        receiver = ForceOfflineReceiver()
        registerReceiver(receiver,intentFilter)
    }

    override fun onPause() {
        super.onPause()

        if(receiver != null) {
            unregisterReceiver(receiver)
            receiver = null
        }
    }

    class ForceOfflineReceiver : BroadcastReceiver() {
        override fun onReceive(context: Context?, intent: Intent?) {
            var builder = AlertDialog.Builder(context)
            builder.setTitle("Warning")
            builder.setMessage("You are force to be offline. Please try to login again!")
            builder.setCancelable(false)

            builder.setPositiveButton("OK",DialogInterface.OnClickListener{
                dialog, which ->
                ActivityCollector.finishAll()
                var intent = Intent(context,LoginActivity::class.java)
                context?.startActivity(intent)
            })

            builder.show()
        }
    }
}


LoginActivity.kt --->


package com.example.fredric.broadcastloginout

import android.content.Intent
import android.os.Bundle
import android.widget.Button
import android.widget.EditText
import android.widget.Toast


class LoginActivity : BaseActivity() {

    var accountEdit: EditText? = null
    var passwordEdit: EditText? = null
    var login: Button? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_login)

        accountEdit = findViewById<EditText>(R.id.account)
        passwordEdit = findViewById<EditText>(R.id.password)
        login = findViewById<Button>(R.id.login)

        login?.setOnClickListener{
            val account = accountEdit?.text.toString()
            var password = passwordEdit?.text.toString()
            if(account.equals("admin") && password.equals("123456")) {
                val intent = Intent(LoginActivity@this, MainActivity::class.java)
                startActivity(intent)
                finish()
            }else {
                Toast.makeText(LoginActivity@this, "Account or password is invalid", Toast.LENGTH_SHORT).show()
            }
        }
    }

}




MainActivity.kt --->

package com.example.fredric.broadcastloginout

import android.content.Intent
import android.os.Bundle
import android.widget.Button

class MainActivity : BaseActivity() {

    var forceOfflineBtn: Button? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        forceOfflineBtn = findViewById<Button>(R.id.force_offline_btn)
        forceOfflineBtn?.setOnClickListener{
            val intent = Intent("com.example.broadcastbestpractice.FORCE_OFFLINE")
            sendBroadcast(intent)
        }

    }
}



AndroidManifest.xml -->

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.fredric.broadcastloginout">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
        </activity>
        <activity
            android:name=".LoginActivity"
            android:label="@string/title_activity_login"
            >

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

</manifest>



activity_login.xml --->


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".LoginActivity">


    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="60dp"
       >

        <TextView
            android:layout_width="90dp"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:textSize="18sp"
            android:text="Account:" />

        <EditText
            android:id="@+id/account"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:layout_gravity="center_vertical"
            />
    </LinearLayout>



    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="60dp"
        >

        <TextView
            android:layout_width="90dp"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:textSize="18sp"
            android:text="Password:" />

        <EditText
            android:id="@+id/password"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:layout_gravity="center_vertical"
            android:inputType="textPassword"
            />
    </LinearLayout>

    <Button
        android:id="@+id/login"
        android:layout_width="match_parent"
        android:layout_height="60sp"
        android:text="Login" />


</LinearLayout>


activity_main.xml --->

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">


    <Button
        android:id="@+id/force_offline_btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:textAllCaps="false"
        android:text="Send Force Offline Broadcast" />
</LinearLayout>


运行效果:









































评论