首页 > 代码库 > 广播的最佳实践--实现强制下线功能

广播的最佳实践--实现强制下线功能

首先创建一个ActivityCollector类用于管理所有的活动

package com.zhangbz.broadcastbestpractice;import java.util.ArrayList;import java.util.List;import android.app.Activity;public class ActivityCollector {    public static List<Activity> activities = new ArrayList<Activity>();        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.zhangbz.broadcastbestpractice;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:layout_width="match_parent"    android:layout_height="match_parent"    android:stretchColumns="1" >        <TableRow >                <TextView            android:layout_height="wrap_content"            android:text="Account:"/>                <EditText            android:id="@+id/account"            android:layout_height="wrap_content"            android:hint="Input your account"/>    </TableRow>        <TableRow >                    <TextView            android:layout_height="wrap_content"            android:text="Password:"/>                <EditText            android:id="@+id/password"            android:layout_height="wrap_content"            android:inputType="textPassword"/>        </TableRow>        <TableRow >                <Button             android:id="@+id/login"            android:layout_height="wrap_content"            android:layout_span="2"            android:text="Login"/>    </TableRow></TableLayout>

编写登陆界面的活动,新建LoginActivity继承自BaseActivity

package com.zhangbz.broadcastbestpractice;import android.content.Intent;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;import android.widget.Toast;public class LoginActivity extends BaseActivity {        private EditText accountEdit;    private EditText passwordEdit;    private Button login;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.login);        accountEdit = (EditText) findViewById(R.id.account);        passwordEdit = (EditText) findViewById(R.id.password);        login = (Button) findViewById(R.id.login);                login.setOnClickListener(new OnClickListener() {                        @Override            public void onClick(View v) {                String account = accountEdit.getText().toString();                String password = passwordEdit.getText().toString();                //如果账号是admin且密码是123456,就认为登录成功                if (account.equals("admin")&&password.equals("123456")) {                    Intent intent = new Intent(LoginActivity.this, MainActivity.class);                    startActivity(intent);                    finish();                } else {                    Toast.makeText(LoginActivity.this, "account or password is invalid", Toast.LENGTH_SHORT).show();                }            }        });    }}

修改activity_main.xml

 

<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">    <Button        android:id="@+id/force_offline"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:text="Send force offline broadcast" /></LinearLayout>

修改MainActivity

package com.zhangbz.broadcastbestpractice;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;public class MainActivity extends BaseActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        Button forceOffline = (Button) findViewById(R.id.force_offline);                forceOffline.setOnClickListener(new OnClickListener() {                        @Override            public void onClick(View v) {                Intent intent = new Intent("com.zhangbz.broadcastbestpractice.FORCE_OFFLINE");                sendBroadcast(intent);            }        });    }}

创建一个广播接收器

package com.zhangbz.broadcastbestpractice;import android.app.AlertDialog;import android.app.AlertDialog.Builder;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("Warning");        dialogBuilder.setMessage("You are forced to be offline. Please try to login again.");        dialogBuilder.setCancelable(false);        dialogBuilder.setPositiveButton("OK", new DialogInterface.OnClickListener() {                        @Override            public void onClick(DialogInterface dialog, int which) {                ActivityCollector.finishAll();//销毁所有活动                Intent intent = new Intent(context, LoginActivity.class);                intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);                context.startActivity(intent);//重新启动LoginActivity            }        });        AlertDialog alertDialog = dialogBuilder.create();        //需要设置alterDialog的类型,保证在广播接收器可以正常弹出        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.zhangbz.broadcastbestpractice"    android:versionCode="1"    android:versionName="1.0" >    <uses-sdk        android:minSdkVersion="14"        android:targetSdkVersion="17" />    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>    <application        android:allowBackup="true"        android:icon="@drawable/ic_launcher"        android:label="@string/app_name"        android:theme="@style/AppTheme" >        <activity            android:name=".LoginActivity"            android:label="@string/app_name" >            <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.zhangbz.broadcastbestpractive.FORCE_OFFLINE"/>            </intent-filter>        </receiver>    </application></manifest>

 

广播的最佳实践--实现强制下线功能