强制下线功能
2016-03-11 14:05
495 查看
很多应用程序都会有强制下线的功能,比如遇到账号异地登陆的情况,当前账号就会收到即将强制下线的提示。该功能的实现方法不难,接下来我们就来实现它。
新建一个项目,删除默认的MainActivity类和layout文件夹下的默认布局。
首先要新建一个静态类型的ActivityFactory类来管理所有的Activity,强制下线功能就是依据当中的finishAllActivity()方法。
然后再新建一个BaseActivity类继承Activity类,让BaseActivity类作为程序中建立的所有Activity类的父类。这样,activityList就包含了所有建立的Activity,当Activity销毁时再移除它。
在layout文件夹下再新建一个布局文件login_layout,作为登陆界面的布局资源。包含两个TextView和两个EditText,以及一个登陆Button。
新建一个LoginActivity类继承BaseActivity类,作为登陆活动界面。
再新建InitActivity类继承BaseActivity类,作为登陆后的初始化界面。在此之前,还要先在layout文件夹下为之建立个布局文件init_layout.xml。
InitActivity界面包含一个TextView文本和两个Button,一个Button的作用是用来新建一个InitActivity活动。这样,程序就可以包含许多Activity,强制下线功能也可以表现得更加明显。另一个Button的作用是启动强制下线功能。
此外,“强制下线”该命令的传递是通过广播机制来实现的,所以当点击强制下线按钮时,发送了一条自定义广播。
既然是用到了广播机制,那自然要有一个广播接收者。新建一个ConstrainOfflineReceiver类继承BroadcastReceiver,重写onReceive方法,强制下线方法就在这里调用。
最后,因为程序用到了广播机制,所以需要到AndroidManifest中注册
程序运行结果如下所示:
新建一个项目,删除默认的MainActivity类和layout文件夹下的默认布局。
首先要新建一个静态类型的ActivityFactory类来管理所有的Activity,强制下线功能就是依据当中的finishAllActivity()方法。
public class ActivityFactory { //Activity集合 public static List<Activity> activityList = new ArrayList<Activity>(); //增添Activity public static void addActivity(Activity activity) { activityList.add(activity); } //移除Activity public static void removeActivity(Activity activity) { activityList.remove(activity); } //结束所有的Activity public static void finishAllActivity() { for (Activity activity : activityList) { if (!activity.isFinishing()) { activity.finish(); } } } }
然后再新建一个BaseActivity类继承Activity类,让BaseActivity类作为程序中建立的所有Activity类的父类。这样,activityList就包含了所有建立的Activity,当Activity销毁时再移除它。
public class BaseActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ActivityFactory.addActivity(this); } @Override protected void onDestroy() { super.onDestroy(); ActivityFactory.removeActivity(this); } }
在layout文件夹下再新建一个布局文件login_layout,作为登陆界面的布局资源。包含两个TextView和两个EditText,以及一个登陆Button。
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:padding="20dp" > <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="账号:" /> <EditText android:id="@+id/account" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:hint="admin" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="密码:" /> <EditText android:id="@+id/password" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:hint="123" android:inputType="textPassword" /> </LinearLayout> <Button android:id="@+id/login_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:text="登陆" /> </LinearLayout>
新建一个LoginActivity类继承BaseActivity类,作为登陆活动界面。
public class LoginActivity extends BaseActivity { //账号编辑框 private EditText account_edit; //密码编辑框 private EditText password_edit; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.login_layout); account_edit = (EditText) findViewById(R.id.account); password_edit = (EditText) findViewById(R.id.password); findViewById(R.id.login_button).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { //当账号和密码无误时,启动初始界面InitActivity,并销毁当前界面 if (account_edit.getText().toString().equals("admin") && password_edit.getText().toString().equals("123")) { Intent intent = new Intent(LoginActivity.this, InitActivity.class); startActivity(intent); finish(); } else { Toast.makeText(LoginActivity.this, "账号或密码错误", Toast.LENGTH_SHORT).show(); account_edit.setText(""); password_edit.setText(""); } } }); } }
再新建InitActivity类继承BaseActivity类,作为登陆后的初始化界面。在此之前,还要先在layout文件夹下为之建立个布局文件init_layout.xml。
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:gravity="center" android:text="这是另一个界面" /> <Button android:id="@+id/show_another_activity" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center" android:gravity="center" android:text="开启另一个Activity" /> <Button android:id="@+id/constraint_offline_button" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center" android:gravity="center" android:text="强制下线" /> </LinearLayout>
InitActivity界面包含一个TextView文本和两个Button,一个Button的作用是用来新建一个InitActivity活动。这样,程序就可以包含许多Activity,强制下线功能也可以表现得更加明显。另一个Button的作用是启动强制下线功能。
此外,“强制下线”该命令的传递是通过广播机制来实现的,所以当点击强制下线按钮时,发送了一条自定义广播。
public class InitActivity extends BaseActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.init_layout); findViewById(R.id.show_another_activity).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(InitActivity.this, InitActivity.class); startActivity(intent); } }); findViewById(R.id.constraint_offline_button).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent("com.czy.constraintOffline"); sendBroadcast(intent); } }); } }
既然是用到了广播机制,那自然要有一个广播接收者。新建一个ConstrainOfflineReceiver类继承BroadcastReceiver,重写onReceive方法,强制下线方法就在这里调用。
public class ConstrainOfflineReceiver extends BroadcastReceiver { @Override public void onReceive(final Context context, Intent intent) { //结束所有Activity后再启动登陆界面 ActivityFactory.finishAllActivity(); Intent in = new Intent(context, LoginActivity.class); in.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(in); } }
最后,因为程序用到了广播机制,所以需要到AndroidManifest中注册
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.constraintoffline" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="21" /> <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="com.example.constraintoffline.InitActivity" > </activity> <receiver android:name=".ConstrainOfflineReceiver" > <intent-filter> <action android:name="com.czy.constraintOffline" /> </intent-filter> </receiver> </application> </manifest>
程序运行结果如下所示:
项目代码的下载地址:强制下线功能
相关文章推荐
- 每周更新的学习进度表
- scheduledthreadpoolexecutor定时任务
- java加密
- [bzoj3172][TJOI2013]单词
- 详解Angularjs中的依赖注入
- linux下杀死进程的N中方法
- 2014年最新前端开发面试题(题目列表+答案 完整版)
- OC与JavaScript交互学习过程中的资料整理
- Eclipse 配置代理更新下载SDK
- 新的开始,向前辈学习
- RAC配置SSH
- Apple:如何在iphone、ipad上安装一些常用命令行命令
- 第5章 我的租房网
- 根据指定路径以及指定文件后缀名 获取文件名
- Linux下使用 bind搭建DNS主从服务器
- Valgrind确实是强大的工具http://www.cnblogs.com/nicebear/archive/2012/05/05/2485054.html
- 批量将txt文件转为csv文件
- IPP库简介
- logback.xml配置
- PKCS #1 RSA Encryption Version 1.5