您的位置:首页 > 移动开发 > Android开发

android实现强制下线功能

2017-01-06 21:49 676 查看
      我们可能都会遇见过下面这种情况,例如我们的QQ,当有其他的手机登录我们的账号之后,就会弹出一个对话框,意思就是“我们的账号在其他地方登录,您已被强制下线”。点击按钮之后,我们就会重新进入登录界面。那么这种强制下线的功能是如何实现的呢?其实非常的简单,就是一个广播。当我们的基类收到这个广播之后,点击对话框中的按钮。强制关闭所有的Activity。然后进入登录界面就可以了。先看一下今天的演示效果吧。

 


   从上面的功能图可以看到
    登录界面--->主界面(按钮)—>点击按钮(弹出被迫下线对话框)—>点击对话框的确定按钮—>登录界面
   
第一步:我们按照这个流程做一遍。首先我们新建一个项目ForceOffLineTest。新建一个ActivityCollector。起作用是回收所有的Activity,我们使用这个类的目的就是点击对话框中的按钮时,能够结束所有的Activity,听起来有点像之前我们使用过的点击按钮退出整个程序的功能。其实实现方法是一样的。看源代码:
package com.fdd;

import java.util.ArrayList;
import java.util.List;
import android.app.Activity;

public class ActivityCollector {
//声明一个List集
public static List<Activity> activities=new ArrayList<Activity>();

//将activity添加到List集中
public static void addActivity(Activity activity){
activities.add(activity);
}

//将某一个Activity移除
public static void removeActivity(Activity activity){
activities.remove(activity);
}

//结束所有添加进来的的Activity
public static void finishAll(){
for(Activity activity:activities){
//如果activity没有销毁,那么销毁
if(!activity.isFinishing()){
activity.finish();
}
}
}
}
第二步     新建一个基类,BaseActivity, 我们会在这个类中调用上面ActivityCollector的方法。我们定义好了之后。让下面所有的Activity全部继承与BaseActivity。
package com.fdd;

import android.app.Activity;
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.content.IntentFilter;
import android.os.Bundle;

public class BaseActivity extends Activity {

private MyReceiver receiver;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

//将启动的Activity添加进来
ActivityCollector.addActivity(this);
}

@Override
protected void onDestroy() {
ActivityCollector.removeActivity(this);
super.onDestroy();
}

//注册广播
@Override
protected void onResume() {
IntentFilter fliter=new IntentFilter();
fliter.addAction("OffLine");
receiver=new MyReceiver();
registerReceiver(receiver, fliter);
super.onResume();
}

//注销广播
@Override
protected void onPause() {
unregisterReceiver(receiver);
super.onPause();
}

//接收广播
private class MyReceiver  extends BroadcastReceiver{

@Override
public void onReceive(final Context context, Intent intent) {
AlertDialog.Builder builer=new AlertDialog.Builder(context);
builer.setTitle("强制下线广播")
.setMessage("您的账号在异地登录")
.setCancelable(true)//设置取消按钮不能使用,
.setPositiveButton("确定", new OnClickListener() {

@Override
public void onClick(DialogInterface dialog, int which) {
ActivityCollector.finishAll()             Intent in=new Intent(context ,LoginActivity.class);
startActivity(in);
}
}).show();
}

}
}
我们可以看到,我们在里面主要完成了两个功能。我们对里面的几个方法,一个一个叙述。

第一:调用ActivityCollector中的三个方法。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//将启动的Activity添加进来
ActivityCollector.addActivity(this);
}
我们由于我们的子类会继承BaseActivity。这样每当我们得BaseActivity创建的的时候,会将之类的实例加载进来。
@Override
protected void onDestroy() {
ActivityCollector.removeActivity(this);
super.onDestroy();
}
这个方法更好理解,当我们销毁BaseActivity就会把加载进来的子类全部销毁,这样就完成了退出程序的功能。

 第二:注册一个广播,并实现广播:在文章的开始我们提到过我们的下线功能是通过广播来完成的,我们的广播就是在这里去接受的。  
//接收广播
private class MyReceiver  extends BroadcastReceiver{

@Override
public void onReceive(final Context context, Intent intent) {
AlertDialog.Builder builer=new AlertDialog.Builder(context);
builer.setTitle("强制下线广播")
.setMessage("您的账号在异地登录")
.setCancelable(true)//设置取消按钮不能使用,
.setPositiveButton("确定", new OnClickListener() {

@Override
public void onClick(DialogInterface dialog, int which) {
ActivityCollector.finishAll()                Intent in=new Intent(context ,LoginActivity.class);
startActivity(in);
}
}).show();
}

}
我们在接受广播的时候,弹出一个强制下线的对话框,注意我们得“取消”一定要设置成不可用。否则我们点击取消按钮仍然还会停留在原来的界面。

       接下来的就简单了,新建我们的登录界面LoginActivity。在这个Activty中我们的默认用户名为admin,密码123456。
public class LoginActivity extends BaseActivity {

private Button login;
private EditText username;
private EditText password;
private String username_str;
private String password_str;

@Override
protected void onCreate(Bundle savedInstanceState) {
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.login);
super.onCreate(savedInstanceState);

login=(Button) findViewById(R.id.login);
username=(EditText) findViewById(R.id.username);
password=(EditText) findViewById(R.id.password);

login.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
//注意:一定要在此处获取.如果在外面获取的话
//得到的值即为一开始初始化得值
username_str=username.getText().toString();
password_str=password.getText().toString();

if(username_str.equals("admin")&&password_str.equals("123456")){
Intent intent=new Intent(LoginActivity.this,MainActivity.class);
startActivity(intent);
finish();
}else{
Toast.makeText(LoginActivity.this, "输入有误", 3000).show();
}
}
});
}
}
  我们需要继承BaseActivity。默认密码和用户名。

   好了最后一步,我们在MainActivity中发送广播
public class MainActivity extends BaseActivity {

//发送广播按钮
private Button sendBroadCase;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
sendBroadCase=(Button) findViewById(R.id.sendBroadCast);
//发送下线广播
sendBroadCase.setOnClickListener(new OnClickListener() {

@Override
public  void onClick(View v) {
Intent intent=new  Intent("OffLine");
sendBroadcast(intent);
}
});

}
}
       

     总结:我们发送的广播是动态的,也就是在java代码中添加的在BaseActivty的onResume方法中我们可以看到。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: