Android学习笔记----实现强制下线功能

/*********************************************************************************************************************/

实现类似于QQ中当账号在别处登陆时候的强制下线功能

先创建一个 ActivityCollector 类用于管理所有的活动,代码如下所示:

public class ActivityCollector {

    private static List activities = new ArrayList();

    public static void addActivity(Activity activity) {
        activities.add(activity);
    }

    public static void removeActivity(Activity activity) {
        activities.remove(activity);
    }

    public static void finishAll() {
        for (Activity activity : activities) {
            if (!activity.isFinishing()) {
                activity.finish();
            }
        }
    }

}
然后创建 BaseActivity 类作为所有活动的父类,代码如下所示:

public class BaseActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ActivityCollector.addActivity(this);
    }

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

}
然后让所有的活动都继承自BaseActivity
接下来我们就需要创建一个广播接收器,新建 ForceOfflineReceiver 继承自 BroadcastReceiver,代码如下所示:
public class ForceOfflineReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(final Context context, Intent intent) {
        AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(context);
        dialogBuilder.setTitle("Warning");
        dialogBuilder .setMessage("You are forced to be offline. Please try to login again.");
        dialogBuilder.setCancelable(false);
        dialogBuilder.setPositiveButton("OK",
                new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        ActivityCollector.finishAll();
                        Intent intent = new Intent(context, LoginActivity.class);// LoginActivity是自己定义的登陆Activity
                        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                        context.startActivity(intent);
                    }
                });
        AlertDialog alertDialog = dialogBuilder.create();
        alertDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
        alertDialog.show();
    }

}
由于我们是在广播接收器里启动活动的,因此一定要给 Intent 加入FLAG_ACTIVITY_NEW_TASK 这个标志。最后,还需要把对话框的类型设为 TYPE_SYSTEM_ALERT,不然它将无法在广播接收器里弹出。

接下来我们还需要对 AndroidManifest.xml文件进行配置广播接收者, 有几点内容需要注意,首先由于我们在 ForceOfflineReceiver 里弹出了一个系统级别 的对话框,因此必须要声明android.permission.SYSTEM_ALERT_WINDOW 权限。

当需要强制下线的时候,只需要调用如下代码即可
Intent intent = new Intent("com.example.broadcastbestpractice.FORCE_OFFLINE ");//com.example.broadcastbestpractice.FORCE_OFFLINE为自定义的广播接收者所接收的动作的类型。
sendBroadcast(intent);














你可能感兴趣的:(Android基础)