強制下線通知-基於應用的系統級別對話框

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


3.應用中的act繼承BaseAct,

<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" />








發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章