android实现强制下线功能

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/SDDDLLL/article/details/54142703

      我们可能都会遇见过下面这种情况,例如我们的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方法中我们可以看到。


阅读更多

扫码向博主提问

冯冬冬

非学,无以致疑;非问,无以广识
去开通我的Chat快问

没有更多推荐了,返回首页