使用广播简单模拟强制下线功能。

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();}}}}
2、新建活动基类

用于管理Activity。

package com.example.broadcastpractice;import android.app.Activity;import android.os.Bundle;/** * 所有活动的基类 * @author yy * */public class BaseActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//每创建一个活动,就加入到活动管理器中ActivityCollector.addActivity(this);}@Overrideprotected void onDestroy() {super.onDestroy();//每销毁一个活动,就从活动管理器中移除ActivityCollector.removeActivity(this);}}
3、新建登陆布局

新建登陆布局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>
使用的是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;@Overrideprotected 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() {@Overridepublic 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();}}});}}
在登陆按钮的监听事件中,当登陆验证通过,新新一个活动MainActivity,同时销毁当前活动,如果登陆失败,则清空所填内容。

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 {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//获取按钮Button forceOffline = (Button) findViewById(R.id.force_offline);//注册事件forceOffline.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {//启用广播Intent intent = new Intent("com.example.broadcastpractice.FORCE_OFFLINE");//发送广播--标准广播sendBroadcast(intent);}});}@Overridepublic 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;}}
下面是MainActivity对应的布局文件activity_main.xml:
<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 {@Overridepublic 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() {@Overridepublic 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();}}
7、全集配置文件AndroidManifest.xml

<?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界面,点击按钮,显示上方右图。当点击确定时,会跳到登陆界面。

更多相关文章

  1. Android小项目之底部导航(RadioButton&Fragment&ViewPager)
  2. Android(安卓)之 五大布局案例
  3. 【转】 Array ,Simple ,SimpleCursor Adapter 区别
  4. Drawer实现左右侧滑DrawerLayout
  5. Android(安卓)CardView+RecyclerView实现卡片列表
  6. Android(安卓)pulltorefresh上拉下拉刷新加载
  7. Android使用LocalSocket抓取数据
  8. Android(安卓)布局之GridLayout
  9. android之switch控件的用法

随机推荐

  1. Android(安卓)EditText 禁止换行
  2. Android(安卓)短信模块分析(三) MMS入口
  3. Android(安卓)EventBus学习
  4. 小谈Activity启动模式
  5. 仿抖音短视频APP源码,android获取屏幕尺寸
  6. 一文教你实现 SpringBoot 中的自定义 Val
  7. NFC之让Android自动运行程序
  8. Android(安卓)okHttp:Https之SSL - Hostna
  9. android 权限封装(思路来至于RxPermission
  10. 解决打开Activity相应的edittext不弹出软