您的位置:首页 > 其它

强制下线功能

2016-03-11 14:05 495 查看
很多应用程序都会有强制下线的功能,比如遇到账号异地登陆的情况,当前账号就会收到即将强制下线的提示。该功能的实现方法不难,接下来我们就来实现它。

新建一个项目,删除默认的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>


程序运行结果如下所示:







项目代码的下载地址:强制下线功能

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: