Android 在BroadcastReceiver里面使用AlertDialog的问题解决

在近期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,就可以跑起来了。
第一次写博客,菜鸟一枚,学习不止

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以通过以下步骤在 Android使用 Service 来处理广播并弹出弹窗: 1. 创建一个继承自 Service 的类。 ``` public class MyService extends Service { @Override public IBinder onBind(Intent intent) { return null; } @Override public int onStartCommand(Intent intent, int flags, int startId) { // 处理广播并弹出弹窗的代码 return super.onStartCommand(intent, flags, startId); } } ``` 2. 在 AndroidManifest.xml 文件中注册 Service。 ``` <service android:name=".MyService" /> ``` 3. 在 Service 中注册广播接收器,并在接收到广播时弹出弹窗。 ``` public class MyService extends Service { private BroadcastReceiver mBroadcastReceiver; @Override public void onCreate() { super.onCreate(); mBroadcastReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { // 接收到广播后弹出弹窗 AlertDialog.Builder builder = new AlertDialog.Builder(context); builder.setTitle("提示"); builder.setMessage("收到广播了"); builder.setCancelable(true); builder.show(); } }; IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction("com.example.broadcast.MY_BROADCAST"); registerReceiver(mBroadcastReceiver, intentFilter); } @Override public IBinder onBind(Intent intent) { return null; } @Override public int onStartCommand(Intent intent, int flags, int startId) { // 处理广播的代码 return super.onStartCommand(intent, flags, startId); } @Override public void onDestroy() { super.onDestroy(); unregisterReceiver(mBroadcastReceiver); } } ``` 4. 在需要发送广播的地方发送广播。 ``` Intent intent = new Intent("com.example.broadcast.MY_BROADCAST"); sendBroadcast(intent); ``` 这样,当发送广播时,Service 就会接收到广播并弹出弹窗。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值