基于应用的对话框,无论在哪个activity,收到通知后,都会显示下线通知
效果图如下:
重点:
声明android.permission.SYSTEM_ALERT_WINDOW 权限
记录开启的acitvity,便于销毁
弹出系统级别对话框(无论处于应用的哪个界面)
1.无论你在哪个activity都能显示下线通知,所以receiver不是基于哪个activity的。静态注册
<span style="font-size:18px;">package com.lei.act;
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.view.WindowManager;
public class OffLineReceiver extends BroadcastReceiver {
public static final String ACTION_OFFLINE = "com.lei.receiver.offline";
@Override
public void onReceive(final Context context, Intent intent) {
if (ACTION_OFFLINE.equals(intent.getAction())) {
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setTitle("下线通知");
builder.setMessage("您的账号被迫下线,请重新登陆");
builder.setCancelable(false);//back键不可取消
builder.setPositiveButton("确定", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
ActCollector.finishAll();
Intent intent = new Intent(context, LoginAct.class);
// 加上下面这句以便能在activity外启动
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
}
});
AlertDialog dialog = builder.create();
// 必须设置类型,保证正常弹出对话框,还需要在manifist中声明权限
dialog.getWindow().setType(
WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
dialog.show();
}
}
}
</span>
在manifist中注册
<receiver android:name="com.lei.act.OffLineReceiver" >
<intent-filter>
<action android:name="com.lei.receiver.offline" />
</intent-filter>
</receiver>
2.在点击确定后,应用的所有activity需要停止,销毁,所以我们需要一个辅助类来记录开启的activity
<span style="font-size:18px;">package com.lei.act;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
public class ActCollector {
private static List<Activity> activities = new ArrayList<Activity>();
// 添加
public static void addActivity(Activity act) {
activities.add(act);
}
// 移除
public static void removeActivity(Activity act) {
activities.remove(act);
}
// 销毁全部
public static void finishAll() {
for (Activity act : activities) {
if (!act.isFinishing()) {
act.finish();
}
}
}
}
</span>
如果在每个activity中的onCreate 和onDestory中添加移除太麻烦,写一个extends activity的基类,让其他activity继承他
<span style="font-size:18px;">package com.lei.act;
import android.app.Activity;
import android.os.Bundle;
public class BaseAct extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActCollector.addActivity(this);
}
@Override
protected void onDestroy() {
super.onDestroy();
ActCollector.removeActivity(this);
}
}
</span>
<span style="font-size:18px;">package com.lei.act;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import com.lei.demo.R;
public class MainAct extends BaseAct {
private Button mSendOffLineBtn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);//父类
setContentView(R.layout.act_main);
mSendOffLineBtn = (Button) findViewById(R.id.send_offline_btn);
mSendOffLineBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
sendBroadcast(new Intent(OffLineReceiver.ACTION_OFFLINE));
}
});
}
}
</span>
4. 登陆界面,他不需要显示通知i,所以不用继承BaseAct
<span style="font-size:18px;">package com.lei.act;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import com.lei.demo.R;
public class LoginAct extends Activity implements OnClickListener {
private EditText mNameEt;//用户名输入框
private EditText mPasswordEt;//密码输入框
private Button mLoginBtn;//登陆按钮
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.act_login);
initView();
}
private void initView() {
mNameEt = (EditText) findViewById(R.id.login_name_et);
mPasswordEt = (EditText) findViewById(R.id.login_password_et);
mLoginBtn = (Button) findViewById(R.id.login_btn);
mLoginBtn.setOnClickListener(this);
}
@Override
public void onClick(View v) {
if ("lei".equals(mNameEt.getText().toString())
&& "123456".equals(mPasswordEt.getText().toString())) {
startActivity(new Intent(LoginAct.this, MainAct.class));
finish();
}
}
}
</span>
4.因为对话框是属于系统级别,所以要声明权限
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />