Adroid中广播接收者的使用,实现强制下线功能

来源:互联网 发布:linux exit是什么意思 编辑:程序博客网 时间:2024/05/01 18:54
强制下线的思路:
只要在界面上弹出一个对话框让用户无法进行其他操作,必须点
对话框的确定按钮,然后返回到登陆界面,可是存在着一个问题
强制下线时可能存在任何一个界面,难道每个界面都要写对话框
,这事我们就应该用到广播和广播接收者


我写了一个例子思路是:
LoginActivity登陆后跳到----》HomeActivity发广播----》


ForceOfflineReceiver中销毁所有的activity然后启动LoginActivity


怎样一次销毁所有activity,前面写过例子

http://blog.csdn.net/zhaihaohao1/article/details/42080287


项目结构:


核心代码:

LoginActivity

/**
 *主界面
 *登录并跳转
 */

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);
accountEdit=(EditText) findViewById(R.id.account);
passwordEdit=(EditText) findViewById(R.id.password);
login=(Button) findViewById(R.id.login);
login.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
String yonghuming = accountEdit.getText().toString().trim();
String mima = passwordEdit.getText().toString().trim();
if (yonghuming.equals("admin")&&mima.equals("123456")) {
Intent intent = new Intent();
intent.setClass(LoginActivity.this, HomeActivity.class);
startActivity(intent);

}else {
Toast.makeText(LoginActivity.this, "信息错误", 10).show();
}




}
});
}






}//class

HomeActivity

/**
 *发广播的界面
 */

public class HomeActivity extends BaseActivity {


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);

Button forceoffline = (Button) findViewById(R.id.force_offline);
forceoffline.setOnClickListener(new OnClickListener() {

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


}
});
}





}//class

ForceOfflineReceiver

/**
 * 
 *广播接收者,没有界面,但是可以显示对话框或者吐丝
 *在广播中销毁所有的activity,并只启动LoginActivity。
 *
 *
 *
 */

public class ForceOfflineReceiver extends BroadcastReceiver{
@Override
public void onReceive(final Context context, Intent intent) {
AlertDialog.Builder dialogBuilder=new AlertDialog.Builder(context);
dialogBuilder.setTitle("强制下线");
dialogBuilder.setMessage("广播接收者中,强制下线,请重新登录");
dialogBuilder.setCancelable(false);
dialogBuilder.setPositiveButton("确定", new DialogInterface.OnClickListener() {

@Override
public void onClick(DialogInterface dialog, int which) {
ActivityCollector.finishAll();//销毁所有的活动
Intent intent =new Intent(context, LoginActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);//重新启动LoginActivity
}
});
AlertDialog alertDialog = dialogBuilder.create();
//需要正常的AlertDialog的类型,保证在广播接收者中可以正常弹出
alertDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
alertDialog.show();



}
}//class

BaseActivity

/**
 * 
 * 调用方法加载,或移除activity的匿名对象
 *
 */



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);
}






}//class

ActivityCollector

/**
 * 把所有activity的对象放到list中
 *
 */

public class ActivityCollector {
public static List<Activity>activities=new ArrayList<Activity>();
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();

}

}

}




}//class

主清单中

系统级别的对话框,声明权限

  <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>

注册广播接收者

 <receiver android:name="com.zhh.android.ForceOfflineReceiver">
            <intent-filter >
                <action android:name="QiangZhiXiaXian"/>
            </intent-filter>
        </receiver>

其他的activity也要注册

如果没有明白下载我的例子

http://download.csdn.net/detail/zhaihaohao1/8311537



















0 0
原创粉丝点击