基於應用的對話框,無論在哪個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" />