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