在近期Android的学习中,用到了AlertDialog在BroadcastReceiver中弹出窗口的功能,主要使用的方法就是show()方法,出问题的也是这个方法。最开始报错是没有权限,我将权限设为alertDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
此时运行项目会报错不能拿到权限,然后我将权限改为alertDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_TOAST);
大概意思就是不检查权限,此时仍然报错,is your activity running?查阅资料发现AlertDialog的context应该绑定给一个activity而不是一个Receiver的context,然后更改代码,获取当前MainActivity的context用于AlertDialog即可成功运行。
主要代码如下:
MyBroadcastReceiver.java
@Override
public void onReceive(Context context, Intent intent) {
//此处获取的当前MainActivity
Activity currentActivity = ActivityManager.getCurrentActivity();
//这里的问题就是AlertDialog绑定的context必须是一个activity的context
AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(currentActivity);
dialogBuilder.setTitle("警告:");
dialogBuilder.setMessage("您的账号在别处登录,请重新登陆~");
dialogBuilder.setCancelable(false);
dialogBuilder.setPositiveButton("确定",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
ActivityManager.finishAll();
Intent intent=new Intent(currentActivity,LoginActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
currentActivity.startActivity(intent);
}
});
AlertDialog alertDialog = dialogBuilder.create();
alertDialog.show();
}
至于代码中为什么要把alertDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_TOAST);
删除才能成功运行我没搞清楚
在AndroidManifest.xml清单文件中加入权限
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
ActivityManager.java
Activity的管理类 获取当前Activity方法主要在这里面进行定义
public class ActivityManager {
private static List<Activity> activities = new ArrayList<>();
private static Activity mCurrentActivity;
public static void addActivity(Activity activity){
activities.add(activity);
}
public static void removeActivity(Activity activity){
activities.remove(activity);
}
public static void setCurrentActivity(Activity activity){
mCurrentActivity = activity;
}
public static Activity getCurrentActivity(){
return mCurrentActivity;
}
public static void finishAll(){
for (Activity activity: activities
) {
if (!activity.isFinishing()) {
activity.finish();
}
}
}
}
``
MyBaseActivity.java
定义一个类,作为所有activity的基类
public class MyBaseActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityManager.addActivity(this);
ActivityManager.setCurrentActivity(this);
}
@Override
protected void onDestroy() {
super.onDestroy();
ActivityManager.removeActivity(this);
}
}
LoginActivity.java
登录Activity
public class LoginActivity extends MyBaseActivity implements View.OnClickListener {
private SharedPreferences pre;
private SharedPreferences.Editor editor;
private EditText username;
private EditText password;
private Button login;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
pre = PreferenceManager.getDefaultSharedPreferences(this);
bindView();
login.setOnClickListener(this);
}
private void bindView(){
username = (EditText)findViewById(R.id.login_username);
password = (EditText)findViewById(R.id.login_passwd);
login = (Button) findViewById(R.id.btn_login);
}
@Override
protected void onStart() {
super.onStart();
if (!pre.getString("user","").equals("")){
username.setText(pre.getString("username",""));
password.setText(pre.getString("username",""));
}
}
@Override
public void onClick(View view) {
String user = username.getText().toString();
String pwd = password.getText().toString();
if (user.equals("123")&&pwd.equals("123")){
editor = pre.edit();
editor.putString("username",user);
editor.putString("password",pwd);
editor.commit();
Intent intent = new Intent(LoginActivity.this,MainActivity.class);
startActivity(intent);
Toast.makeText(this, "不错啊,居然蒙对了", Toast.LENGTH_SHORT).show();
finish();//结束此activity,跳转到主activity
}else {
Toast.makeText(this, "这么简单都错,请把脑子捐给需要的人", Toast.LENGTH_SHORT).show();
}
}
}
MainActivity.java
主Activity,负责发送广播
``
public class MainActivity extends MyBaseActivity implements View.OnClickListener {
private MyBroadcastReceiver localReceiver;
private LocalBroadcastManager broadcastManager;
private IntentFilter intentFilter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
broadcastManager = LocalBroadcastManager.getInstance(this);
//设置过滤器
localReceiver = new MyBroadcastReceiver();
intentFilter = new IntentFilter();
intentFilter.addAction("com.example.localbroadcast.LONGIN_OTHER");
broadcastManager.registerReceiver(localReceiver,intentFilter);
Button button = findViewById(R.id.btn_send);
button.setOnClickListener(this);
}
@Override
public void onClick(View view) {
Intent intent = new Intent("com.example.localbroadcast.LONGIN_OTHER");
broadcastManager.sendBroadcast(intent);
}
@Override
protected void onDestroy() {
super.onDestroy();
broadcastManager.unregisterReceiver(localReceiver);
}
}
然后在清单文件中注册好广播和Activity,就可以跑起来了。
第一次写博客,菜鸟一枚,学习不止