Android(安卓)使用BroadCast实现强制下线功能
16lz
2021-01-24
使用广播简单模拟强制下线功能。
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界面,点击按钮,显示上方右图。当点击确定时,会跳到登陆界面。
更多相关文章
- Android小项目之底部导航(RadioButton&Fragment&ViewPager)
- Android(安卓)之 五大布局案例
- 【转】 Array ,Simple ,SimpleCursor Adapter 区别
- Drawer实现左右侧滑DrawerLayout
- Android(安卓)CardView+RecyclerView实现卡片列表
- Android(安卓)pulltorefresh上拉下拉刷新加载
- Android使用LocalSocket抓取数据
- Android(安卓)布局之GridLayout
- android之switch控件的用法