如何从BroadcastReceiver以编程方式启动Flutter应用程序



我实现BroadcastReceiver的目的是能够在传入或传出呼叫结束时启动关闭的Flutter应用程序。Flutter应用程序具有本地Android代码,以便配置允许在后台跟踪手机状态的服务。当电话状态发生变化时,BroadcastReceiver工作并调用相应的功能。例如,当传入呼叫结束时,onReceive方法调用onIncomingCallEnded函数。然后,如本文所述,通过使用PackageManageronReceive方法的Context对象传递给该函数,该方法用于创建意图。如果Flutter应用程序已关闭,则应该启动该意图。

protected void onIncomingCallEnded(Context ctx, String number, Date start, Date end)
{
Log.i("CallObserver", "We finished a call");
Intent i = ctx.getPackageManager().getLaunchIntentForPackage("com.example.flutter_call_app_java");
if(i != null) {
Log.i("CallObserver","intent is not null");
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); //Used to start an Activity outside of an Activity Context.
ctx.startActivity(i);
}
else {
Log.e("CallObserver","Couldn't start app");
}
}

当调用onIncomingCallEnded函数时,日志显示intent不是null,但Flutter应用程序不会启动。Logcat中不存在错误。我参考了James Gardiner的一篇帖子和nub的另一篇帖子,尽管他们的目标与我的目标有关,但他们问题的解决方案似乎不适合我的用例(我已经测试了他们的解决方案(。我还实现了Ramakrishna Joshi关于在AndroidManifest中放置包名称的注释,以检查用户设备上是否安装了包。我在Windows 10桌面上的Android Studio Arctic Fox | 2020.3.1 Patch 4中使用Android API 30的Android模拟器。

David Wasser的观察结果是正确的。当使用API 28及以下版本时,一切正常,但由于从后台启动活动的限制,API 29及以上版本无法正常运行。对于我的用例来说,显示通知似乎是一个适当的折衷方案。

最新更新