活动无法从广播接收器开始

时间:2019-10-04 06:36:43

标签: android broadcastreceiver

来自Broadcast接收器的Start Activity在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) {

                    }
                } 

5 个答案:

答案 0 :(得分:2)

您需要在意图中添加标志

i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

在致电context.startActivity(i);

之前

答案 1 :(得分:0)

下面我从广播接收器发送启动活动的示例,但这是在设备重启后启动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);
        }
    }

}

答案 2 :(得分:0)

Android Q(API级别29)和更高的位置限制,允许应用程序在后台运行时何时启动活动。

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

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

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

它像魅力一样运作

答案 3 :(得分:0)

将此添加到您的 AndroidManifest.xml

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

从适当的活动中请求显示覆盖权限:

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);
}

答案 4 :(得分:-1)

我看到您正在听onCallStateChanged。但我认为您需要征得Android 9的许可: https://stackoverflow.com/a/52025013/2212770