1、新建活动管理类
新建Activity活动管理类,方便管理所有活动。
- package com.example.broadcastpractice;
- import java.util.ArrayList;
- import java.util.List;
- import android.app.Activity;
- /**
- * 所有活动管理器
- * @author yy
- *
- */
- public class ActivityCollector {
- public static List<Activity> activities = new ArrayList<Activity>();
- /**
- * 添加活动
- * @param activity
- */
- public static void addActivity(Activity activity){
- if(!activities.contains(activity)){
- activities.add(activity);
- }
- }
- /**
- * 移除活动
- * @param activity
- */
- public static void removeActivity(Activity activity){
- activities.remove(activity);
- }
- /**
- * 结束所有活动
- */
- public static void finishAll(){
- for(Activity activity : activities){
- if(!activity.isFinishing()){
- activity.finish();
- }
- }
- }
- }
用于管理Activity。
- package com.example.broadcastpractice;
- import android.app.Activity;
- import android.os.Bundle;
- /**
- * 所有活动的基类
- * @author yy
- *
- */
- 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);
- }
- }
新建登陆布局login.xml,如下:
- <?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
- android:id="@+id/tableRow1"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content" >
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="Account:" />
- <EditText
- android:id="@+id/account"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:hint="Input your account here"
- android:ems="10" >
- </EditText>
- </TableRow>
- <TableRow
- android:id="@+id/tableRow2"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content" >
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="Password:"
- />
- <EditText
- android:id="@+id/password"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:ems="10"
- android:inputType="textPassword"
- >
- </EditText>
- </TableRow>
- <TableRow
- android:id="@+id/tableRow3"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content" >
- <Button
- android:id="@+id/login"
- android:layout_span="2"
- android:layout_height="wrap_content"
- android:text="Login" />
- </TableRow>
- </TableLayout>
4、新建登陆布局对应的Activity
新建登陆布局对应的Activity类,用于加载登陆布局:
- package com.example.broadcastpractice;
- 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 loginButton;
- @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);
- loginButton = (Button) findViewById(R.id.login);
- //注册按钮点击事件
- loginButton.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- String account = accountEdit.getText().toString();
- String password = passwordEdit.getText().toString();
- if(account.equals("yy") && password.equals("123456")){
- //登陆成功
- //启用MainActivity活动
- Intent intent = new Intent(LoginActivity.this,MainActivity.class);
- //启动
- startActivity(intent);
- //当前活动销毁
- finish();
- }else{
- //登陆失败
- //清空内容
- accountEdit.setText("");
- passwordEdit.setText("");
- Toast.makeText(LoginActivity.this, "登陆失败,请重新登陆!!", Toast.LENGTH_SHORT).show();
- }
- }
- });
- }
- }
5、MainActivity
- package com.example.broadcastpractice;
- import android.content.Intent;
- import android.os.Bundle;
- import android.view.Menu;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
- /**
- * 继承BaseActivity
- * @author yy
- *
- */
- 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.example.broadcastpractice.FORCE_OFFLINE");
- //发送广播--标准广播
- sendBroadcast(intent);
- }
- });
- }
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- // Inflate the menu; this adds items to the action bar if it is present.
- getMenuInflater().inflate(R.menu.main, menu);
- return true;
- }
- }
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:orientation="vertical" >
- <Button
- android:id="@+id/force_offline"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:text="强制下线" />
- </LinearLayout>
6、广播接收器
- package com.example.broadcastpractice;
- import android.app.AlertDialog;
- import android.content.BroadcastReceiver;
- import android.content.Context;
- import android.content.DialogInterface;
- import android.content.DialogInterface.OnClickListener;
- import android.content.Intent;
- import android.view.WindowManager;
- /**
- * 强制下线广播接收器
- * @author yy
- *
- */
- public class ForceOfflineBroadCastReceiver extends BroadcastReceiver {
- @Override
- public void onReceive(final Context context, Intent intent) {
- //对话框
- AlertDialog.Builder builder = new AlertDialog.Builder(context);
- builder.setTitle("警告");
- //正文
- builder.setMessage("你已被强制下线,请重新登陆。");
- //不可取消
- builder.setCancelable(false);
- //按钮
- builder.setPositiveButton("确定", new 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);
- }
- });
- AlertDialog alterDialog = builder.create();
- //添加对话框类型:保证在广播中正常弹出
- alterDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
- //对话框展示
- alterDialog.show();
- }
- }
- <?xml version="1.0" encoding="utf-8"?>
- <manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.example.broadcastpractice"
- 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="com.example.broadcastpractice.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>
- <!-- MainActivity活动 -->
- <activity android:name=".MainActivity"/>
- <!-- 广播接收器 -->
- <receiver android:name=".ForceOfflineBroadCastReceiver">
- <intent-filter>
- <action android:name="com.example.broadcastpractice.FORCE_OFFLINE"/>
- </intent-filter>
- </receiver>
- </application>
- </manifest>
8、效果展示
当输入错误时,验证不通过,显示上方左图。当输入正确时,验证通过,进入MainActivity界面,点击按钮,显示上方右图。当点击确定时,会跳到登陆界面。