强制下线通知-基于应用的系统级别对话框

基于应用的对话框,无论在哪个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" />








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