Android学习总结(八)———— 广播的最佳实践(实现强制下线功能)
一.基本概念
強制下線功能功能應該算是比較常見的了,很多應用程序都具備這個功能,比如你的QQ號或者微信號在別處登錄了,就會將你強制擠下線。只需要在界面上彈出一個對話框,讓用戶無法進行任何其他的操作,必須要點擊對話框中的確定按鈕,然后回到登錄界面即可。可是這樣就存在著一個問題,因為我們被通知需要強制下線時可能正處于任何一個界面,難道需要在每一個界面都編寫一個彈出對話框的邏輯嗎?如果真的是這樣想那么思維就偏遠了,我們完全可以借助所學的廣播知識來實現這一個功能。
二.代碼之旅
強制下線功能需要先關閉所有的活動,然后回到登錄界面,代碼如下所示:
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();
}
}
}
}
創建一個BaseActivity類作為所有活動的父類,代碼如下所示:
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);
}
}
創建一個登錄界面的布局,代碼如下所示:
<?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="賬號:"/> <EditText
android:id="@+id/etAccount"
android:layout_height="wrap_content"
android:hint="請輸入賬號"/>
</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>
新建一個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) {
//獲取用戶輸入的賬號,密碼的數據
String account = etAccount.getText().toString();
String password = etPassword.getText().toString();
//如果賬號是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,"賬號或密碼是無效的",Toast.LENGTH_SHORT).show();
}
}
}
同樣在MainActivity繼承BaseActivity,一個非常簡單的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);
}
}
創建一個廣播接收器,代碼如下所示:
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) {
/**
* 調用ActivityCollector的finishAll()方法來銷毀掉所有的活動,
* 并重新啟動LoginActivity這個活動
*/
ActivityCollector.finishAll();//銷毀所以活動
Intent intent = new Intent(context,LoginActivity.class);
/**
* 在廣播接收器里啟動活動,因此一定要給Intent加入FLAG_ACTIVITY_NEW_TASK這個標準
*/
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
}
});
AlertDialog alertDialog = dialogBuilder.create();
//需要設置AlertDialog的類型,保證在廣播接收器中可以正常彈出
alertDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
alertDialog.show();
}
}
最后不要忘記在AndroidManifest.xml文件進行配置,代碼如下所示:
<?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>
好了,現在嘗試運行一下程序吧,首先進入到登錄界面,并可以在這里輸入賬號和密碼,如下圖:
如果輸入的賬號是:123,密碼是123,點擊登錄按鈕就會進入到程序的主界面,如下圖:
這時點擊一下發送強制用戶下線的廣播按鈕,就會發出一條強制下線的廣播,ForceOfflineReceiver里收到這條廣播后會彈出一個對話框提示用戶已被強制下線,如下圖所示:
這時用戶將無法再對界面的任何元素進行操作,只能點擊OK按鈕,然后回重新回到登錄界面。這樣,強制下線功能就已經完整的實現了。
總結
以上是生活随笔為你收集整理的Android学习总结(八)———— 广播的最佳实践(实现强制下线功能)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 嘉兴电动车搬运工电话号码谁有吗?
- 下一篇: 【起航计划 004】2015 起航计划