跳至主要内容

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

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>


运行效果:









































评论

此博客中的热门博文

自定义BroadcastReceiver

MainActivity.kt package com.example.fredric.mybroadcast import android.content.Intent import android.support.v7.app.AppCompatActivity import android.os.Bundle import android.widget.Button class MainActivity : AppCompatActivity() { var sendBroadCastBtn : Button? = null override fun onCreate(savedInstanceState: Bundle?) { super .onCreate(savedInstanceState) setContentView(R.layout. activity_main ) sendBroadCastBtn = findViewById <Button> (R.id. send_broadcast_btn ) sendBroadCastBtn ?.setOnClickListener( { _ -> var intent = Intent( "com.example.broadcasttest.MY_BROADCAST" ) sendBroadcast(intent) } ) } } MyBroadcastReceiver.kt package com.example.fredric.mybroadcast import android.content.BroadcastReceiver import android.content.Context import android.content.Intent import android.widget.Toast class MyBroadcastReceiver : BroadcastReceiver() { override fun onReceive(context...

Android使用LitePal操作SQLite数据库(Kotlin)

MainActivity.kt----> package com.example.fredric.litepaltest import android.content.ContentValues import android.support.v7.app.AppCompatActivity import android.os.Bundle import android.util.Log import android.widget.Button import com.example.fredric.litepaltest.bean.Book import org.litepal.LitePal class MainActivity : AppCompatActivity() {     override fun onCreate(savedInstanceState: Bundle?) {         super.onCreate(savedInstanceState)         setContentView(R.layout.activity_main)         var createDatabase = findViewById<Button>(R.id.create_database)         createDatabase.setOnClickListener{             LitePal.getDatabase()         }         var addData = findViewById<Button>(R.id.add_data)         addData.setOnClickListener{           ...

LocalBroadcast本地广播创建

MainActivity.kt ---> package com.example.fredric.localbroadcastreceiver import android.content.BroadcastReceiver import android.content.Context import android.content.Intent import android.content.IntentFilter import android.support.v7.app.AppCompatActivity import android.os.Bundle import android.support.v4.content.LocalBroadcastManager import android.widget.Button import android.widget.Toast class MainActivity : AppCompatActivity() {     var intentFilter: IntentFilter? = null     var localReceiver: LocalReceiver? = null     var localBroadcastManager: LocalBroadcastManager? = null     var sendLocalBroadcastBtn: Button? = null     override fun onCreate(savedInstanceState: Bundle?) {         super.onCreate(savedInstanceState)         setContentView(R.layout.activity_main)         localBroadcastManager = LocalBroadcastManager.getInstance(this)   ...