Android学习总结(八)———— 广播的最佳实践(实现强制下线功能)
一.基本概念
強(qiáng)制下線功能功能應(yīng)該算是比較常見的了,很多應(yīng)用程序都具備這個(gè)功能,比如你的QQ號(hào)或者微信號(hào)在別處登錄了,就會(huì)將你強(qiáng)制擠下線。只需要在界面上彈出一個(gè)對話框,讓用戶無法進(jìn)行任何其他的操作,必須要點(diǎn)擊對話框中的確定按鈕,然后回到登錄界面即可。可是這樣就存在著一個(gè)問題,因?yàn)槲覀儽煌ㄖ枰獜?qiáng)制下線時(shí)可能正處于任何一個(gè)界面,難道需要在每一個(gè)界面都編寫一個(gè)彈出對話框的邏輯嗎?如果真的是這樣想那么思維就偏遠(yuǎn)了,我們完全可以借助所學(xué)的廣播知識(shí)來實(shí)現(xiàn)這一個(gè)功能。
二.代碼之旅
強(qiáng)制下線功能需要先關(guān)閉所有的活動(dòng),然后回到登錄界面,代碼如下所示:
package com.nyl.nativebroadcast; import android.app.Activity; import java.util.ArrayList;
import java.util.List; public class ActivityCollector { public static List<Activity> activities = new ArrayList<>(); public static void addActivity(Activity activity){
activities.add(activity);
} public static void removeActivity(Activity activity){
activities.remove(activity);
}
public static void finishAll(){
for (Activity activity : activities){
if (!activity.isFinishing()){
activity.finish();
}
}
}
}
創(chuàng)建一個(gè)BaseActivity類作為所有活動(dòng)的父類,代碼如下所示:
package com.nyl.nativebroadcast; import android.app.Activity;
import android.os.Bundle; public class BaseActivity extends Activity{ @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityCollector.addActivity(this);
} @Override
protected void onDestroy() {
super.onDestroy();
ActivityCollector.removeActivity(this);
}
}
創(chuàng)建一個(gè)登錄界面的布局,代碼如下所示:
<?xml version="1.0" encoding="utf-8"?>
<TableLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/activity_login"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:stretchColumns="1"> <TableRow> <TextView
android:layout_height="wrap_content"
android:text="賬號(hào):"/> <EditText
android:id="@+id/etAccount"
android:layout_height="wrap_content"
android:hint="請輸入賬號(hào)"/>
</TableRow> <TableRow> <TextView
android:layout_height="wrap_content"
android:text="密碼:"/> <EditText
android:id="@+id/etPassword"
android:layout_height="wrap_content"
android:inputType="textPassword"/>
</TableRow> <TableRow>
<Button
android:id="@+id/btnLogin"
android:layout_height="wrap_content"
android:layout_span="2"
android:text="登錄"/>
</TableRow> </TableLayout>
新建一個(gè)LoginActivity繼承BaseActivity,代碼如下所示:
package com.nyl.nativebroadcast; import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast; public class LoginActivity extends BaseActivity implements View.OnClickListener { private EditText etAccount;
private EditText etPassword;
private Button btnLogin; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
initView(); //初始化布局
} private void initView() {
etAccount = (EditText) findViewById(R.id.etAccount);
etPassword = (EditText) findViewById(R.id.etPassword);
btnLogin = (Button) findViewById(R.id.btnLogin); btnLogin.setOnClickListener(this);
} @Override
public void onClick(View view) {
//獲取用戶輸入的賬號(hào),密碼的數(shù)據(jù)
String account = etAccount.getText().toString();
String password = etPassword.getText().toString();
//如果賬號(hào)是123且密碼是123,就登錄成功
if (account.equals("123") && password.equals("123")){
Intent intent = new Intent(LoginActivity.this,MainActivity.class);
startActivity(intent);
finish();
}else {
Toast.makeText(LoginActivity.this,"賬號(hào)或密碼是無效的",Toast.LENGTH_SHORT).show();
}
}
}
同樣在MainActivity繼承BaseActivity,一個(gè)非常簡單的MainActivity,不過多解釋,代碼如下所示:
package com.nyl.nativebroadcast; import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button; public class MainActivity extends BaseActivity implements View.OnClickListener { private Button btnOffline; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnOffline = (Button) findViewById(R.id.btnOffline); btnOffline.setOnClickListener(this);
} @Override
public void onClick(View view) {
Intent intent = new Intent("com.nyl.nativebroadcast.ForceOfflineReceiver");
sendBroadcast(intent);
}
}
創(chuàng)建一個(gè)廣播接收器,代碼如下所示:
package com.nyl.nativebroadcast; import android.app.AlertDialog;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.view.WindowManager; public class ForceOfflineReceiver extends BroadcastReceiver{ @Override
public void onReceive(final Context context, Intent intent) {
AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(context);
dialogBuilder.setTitle("警告");
dialogBuilder.setMessage("你被迫離線,請重新登錄!");
dialogBuilder.setCancelable(false);
dialogBuilder.setPositiveButton("確定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
/**
* 調(diào)用ActivityCollector的finishAll()方法來銷毀掉所有的活動(dòng),
* 并重新啟動(dòng)LoginActivity這個(gè)活動(dòng)
*/
ActivityCollector.finishAll();//銷毀所以活動(dòng)
Intent intent = new Intent(context,LoginActivity.class);
/**
* 在廣播接收器里啟動(dòng)活動(dòng),因此一定要給Intent加入FLAG_ACTIVITY_NEW_TASK這個(gè)標(biāo)準(zhǔn)
*/
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
}
});
AlertDialog alertDialog = dialogBuilder.create();
//需要設(shè)置AlertDialog的類型,保證在廣播接收器中可以正常彈出
alertDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
alertDialog.show();
}
}
最后不要忘記在AndroidManifest.xml文件進(jìn)行配置,代碼如下所示:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.nyl.nativebroadcast"> <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> <application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".LoginActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".MainActivity"></activity> <receiver android:name=".ForceOfflineReceiver">
<intent-filter>
<action android:name="com.nyl.nativebroadcast.ForceOfflineReceiver"/>
</intent-filter>
</receiver>
</application> </manifest>
好了,現(xiàn)在嘗試運(yùn)行一下程序吧,首先進(jìn)入到登錄界面,并可以在這里輸入賬號(hào)和密碼,如下圖:
如果輸入的賬號(hào)是:123,密碼是123,點(diǎn)擊登錄按鈕就會(huì)進(jìn)入到程序的主界面,如下圖:
這時(shí)點(diǎn)擊一下發(fā)送強(qiáng)制用戶下線的廣播按鈕,就會(huì)發(fā)出一條強(qiáng)制下線的廣播,F(xiàn)orceOfflineReceiver里收到這條廣播后會(huì)彈出一個(gè)對話框提示用戶已被強(qiáng)制下線,如下圖所示:
這時(shí)用戶將無法再對界面的任何元素進(jìn)行操作,只能點(diǎn)擊OK按鈕,然后回重新回到登錄界面。這樣,強(qiáng)制下線功能就已經(jīng)完整的實(shí)現(xiàn)了。
總結(jié)
以上是生活随笔為你收集整理的Android学习总结(八)———— 广播的最佳实践(实现强制下线功能)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 嘉兴电动车搬运工电话号码谁有吗?
- 下一篇: 【起航计划 004】2015 起航计划