Activity 无法从广播接收器启动

Activity can't start from broadcast receiver

Start Activity from Broadcast receiver 在 android 9 上不工作,但它在 android 9 以下工作正常,我对此进行了很多搜索,但找不到合适的解决方案。有没有人遇到同样的问题,这是我的代码。

public void onReceive(final Context context, Intent intent) {

    try {
        this.tm = (TelephonyManager) context.getSystemService("phone");
        this.tm.listen(new PhoneStateListener() {
            public void onCallStateChanged(int state, final String num) {
                if (state == 1 && Receiver.this.preferences.getInt("start", 0) == 1) {
                    try {
                        new Handler().postDelayed(new Runnable() {
                            public void run() {
                                Receiver.this.i = new Intent(context, MainActivity.class);

                                context.startActivity(Receiver.this.i);
                            }
                        }, 300);
                    } catch (Exception e) {

                    }
                } 

我看到您正在收听 onCallStateChanged。但我认为你需要在 Android 9 上请求许可:

您需要向意图添加标志

i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

在你打电话之前 context.startActivity(i);

下面我发送了一个从广播接收器启动 activity 的例子,但是这个是为了在设备重启后启动 MainActivity。

public class StartReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        String action= intent.getAction();
        if( action.equals("android.intent.action.BOOT_COMPLETED") ){

            Intent i= new Intent(context, MainActivity.class);
            i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

            context.startActivity(i);
        }
    }

}

Android Q(API 级别 29)及更高级别限制当应用程序在后台 运行 时应用程序何时可以启动活动。

https://developer.android.com/guide/components/activities/background-starts

但是,您可以通过授予警报 window 权限来实现此目的。

How to start a activity from a broadcast receiver when the screen is locked in Android Q

效果很好

将此添加到您的 AndroidManifest.xml

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>

向适当的 activity:

请求显示覆盖许可
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    if(! Settings.canDrawOverlays(context)) {
        Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + context.getPackageName()));
        startActivityForResult(intent, 101);
    }
}

在onActivityResult里面处理:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if(requestCode == 101) {

            if(!Settings.canDrawOverlays(context)) {
                Toast.makeText(context, "This feature is crucial to this app", Toast.LENGTH_SHORT).show();
            }
        }
}

在您的 BroadcastReceiver 实现中:

@Override
public void onReceive(Context context, Intent intent) {
    Intent intent1 = new Intent(context, ToBeOpenedActivity.class);
    intent1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    context.startActivity(intent1);
}