来自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) {
}
}
答案 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