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

android实现强制下线功能

2018-03-06 21:16 609 查看
1.首先我们想实现的功能,肯定是弹出一个对话窗,然后我们别无选择,只能从活动界面回到登录界面,那么我们做的事情有2件,一时登录界面和强制下线的功能.
2.登录界面的layout:<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="60dp"
>
<TextView
android:text="用户名"
android:layout_width="90dp"
android:layout_height="match_parent"
android:id="@+id/text1"
/>
<EditText
android:layout_width="0dp"
android:layout_height="match_parent"
android:id="@+id/edit_text1"
android:layout_weight="1"
android:hint="请输入用户名"
/>
</LinearLayout>
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="60dp"
>
<TextView
android:text="密码"
android:layout_width="90dp"
android:layout_height="match_parent"
android:id="@+id/text2"
/>
<EditText
android:layout_width="0dp"
android:layout_height="match_parent"
android:id="@+id/edit_text2"
android:layout_weight="1"
android:hint="请输入用户密码"
/>
</LinearLayout>
<Button
android:text="输入完成"
android:id="@+id/button1"
android:layout_width="match_parent"
android:layout_height="wrap_content" />

</LinearLayout>很简单理解吧,就是是一个线性布局嵌套2个子线性布局
2.登录界面的活动文件:package activitytest.example.com.broadcastpractice;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

/**
* Created by D叔 on 2018/3/5.
*/

public class LoginActivity extends BaseActivity{
private EditText accountEdit;
private EditText passwordEdit;
private Button login;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
login=(Button)findViewById(R.id.button1);
accountEdit=(EditText)findViewById(R.id.edit_text1);
passwordEdit=(EditText)findViewById(R.id.edit_text2);
login.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String string1=accountEdit.getText().toString();
String string2 =passwordEdit.getText().toString();
if(string1.equals("joker")&&string2.equals("123456"))
{
Intent intent;
intent=new Intent(LoginActivity.this,MainActivity.class);
startActivity(intent);
finish();
}
else
{
Toast.makeText(LoginActivity.this,"error",Toast.LENGTH_SHORT).show();
}
}
});
}

}
        这个也很好理解,我们获取到用户名和用户密码,只有2个同时满足的时候才符合登入主活动界面,如果不是就输出error,这里判断我原来用的是==来判断,发现不能运行,貌似只能用.equals()来判断,因为此时login才是主活动,所以要修改注册文件.

3. 相信你也发现我的login活动不是继承AppCompatActivity吧,因为我们要实现一个强制下线的功能,而这种功能可以通过一种发广播的形式实现,即是一个广播接收器接收到这条广播之后,就会结束掉所有的活动并且再实现一个新的登录界面,那么我们可以在一个活动中onResume()方法中实现一个广播接收器,但这样我们最多只能实现结束掉当前的活动,有什么方法可以一次性结束掉所有已启动的活动呢,很明显,我们只要每启动一个活动,就把一个活动放进一个栈里面,只要我们广播接收器收到结束所有活动的信息,就清空栈并且用finish来结束活动,再新建一个登录界面类的对象不就行了吗,这个广播接收器要放在哪里呢?我们不可能为每一个活动都写一个广播接收器吧,那么我们是不是只需要让每一个活动都继承同一个活动,而且这个活动同时有广播接收器和实现栈的功能,这岂不是两全其美.package activitytest.example.com.broadcastpractice;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;

/**
* Created by 国民党 on 2018/3/5.
*/

public class BaseActivity extends AppCompatActivity{
private ForceOfflineReceiver receiver;
@Override
protected void onCreate(Bundle saveInstanceState)
{
super.onCreate(saveInstanceState);
ActivityCollector.Addactivity(this);
}
@Override
protected void onDestroy(){
ActivityCollector.remove(this);
super.onDestroy();
}
@Override
protected void onResume()
{
super.onResume();
IntentFilter intentFilter=new IntentFilter();
intentFilter.addAction("FINISH");
receiver =new ForceOfflineReceiver();
registerReceiver(receiver,intentFilter);
}
protected void onPause()
{
super.onPause();
if(receiver!=null)
{
unregisterReceiver(receiver);
receiver=null;
}
}
class ForceOfflineReceiver extends BroadcastReceiver{
@Override
public void onReceive(final Context context, Intent intent)
{
AlertDialog.Builder builder=new AlertDialog.Builder(context);
builder.setTitle("Warning");
builder.setMessage("重回登录界面");
builder.setCancelable(false);
builder.setPositiveButton("OK",new DialogInterface.OnClickListener(){
@Override
public void onClick(DialogInterface dialog,int which)
{
ActivityCollector.Finishallactivity();
Intent intent=new Intent(context,LoginActivity.class);
startActivity(intent);
}
});
builder.show();
}
}
}
        这里我们用了动态的广播的功能,因为静态的广播接收器是不能实现一个UI功能的,这里你会发现有一个ActivityCollector的类,这是我们自己写的一个类,你可以把它理解为一个栈,用于储存每一个活动,很明显它的方法都是静态的,我们把它嵌套在baseactivity中,那么只要我们没创建一个类,那么这个类就会自动储存到栈中,下面我们给出它的代码:package activitytest.example.com.broadcastpractice;

import android.app.Activity;

import java.util.ArrayList;
import java.util.List;

public class ActivityCollector {
public static List<Activity>activities=new ArrayList<>();
public static void Addactivity(Activity activity){
activities.add(activity);
}
public static void Finishallactivity()
{
for(Activity activity:activities)
{
if(!activity.isFinishing())
{
activity.finish();
}
}
}
public static void remove(Activity activity)
{
activities.remove(activity);
}
}
很简单吧,我相信你能看懂<
4000
/p>4.登录界面后的活动:
package activitytest.example.com.broadcastpractice;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends BaseActivity {
private Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button=(Button)findViewById(R.id.button3);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent("FINISH");
sendBroadcast(intent);
}
});
}
}
这里我们用一个按钮来发出一条广播,也不是很难理解我就不说多了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: