活动在 startActivity(intent) 后没有启动

Posted

技术标签:

【中文标题】活动在 startActivity(intent) 后没有启动【英文标题】:Activity doesn't start after startActivity(intent) 【发布时间】:2019-12-10 03:41:19 【问题描述】:

我正在开发出租车/出租车预订系统的司机应用程序。应用程序有前台服务。服务开始在 MainActivity 中使用此代码:

Intent myService = new Intent(getApplicationContext(), OnLineForegroundService.class);
startForegroundService(myService);

此服务使用以下代码通过触发器启动 NewOrderActivity:

Intent intent = new Intent(OnLineForegroundService.this, NewOrderActivity.class);
intent.putExtra("newOrder", newOrder);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);                      
intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
startActivity(intent);

之后在 NewOrderActivity 应用程序中启动 TripActivity(通过用户点击):

//some finish service code
...

Intent intent = new Intent(NewOrderActivity.this, TripActivity.class);
intent.putExtra("order", newOrder);
startActivity(intent);
finish();

最后一步就是行程的结束:

//TripActivity

Intent i = new Intent(TripActivity.this, MainActivity.class);
i.putExtra("showOnLineDialog", true);
startActivity(i);
finishAffinity();

这些操作是循环执行的。有时(很少)NewOrderActivity 在startActivity(intent) 之后没有启动。甚至 NewOrderActivity 中 onCreate(Bundle savedInstanceState)onResume() 中的代码也无法执行。当某些活动处于前台时,什么都不会发生。当应用程序处于后台时(前台服务除外) - 应用程序进入前台并显示上次打开的活动,但不显示 NewOrderActivity。 可能是什么问题呢?我想这个问题可能出在 Activity 生命周期和标志中(FLAG_ACTIVITY_NEW_TASKFLAG_ACTIVITY_NO_HISTORY),但不确定。

清单:

<application
    android:name=".TaxiApplication"
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity
        android:name=".ui.activities.SplashActivity"
        android:screenOrientation="portrait">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity
        android:name=".ui.activities.MainActivity"
        android:screenOrientation="portrait" />
    <activity
        android:name=".ui.activities.NewOrderActivity"
        android:screenOrientation="portrait" />
    <activity
        android:name=".ui.activities.TripActivity"
        android:screenOrientation="portrait" />
    <service android:name=".services.OnLineForegroundService" />
</application>

【问题讨论】:

试试conext.startActivity(intent) @coroutineDispatcher 什么样的上下文? getApplicationContext() ? 【参考方案1】:

我不认为使用服务上下文从服务启动活动是一个好主意,请尝试使用应用程序上下文。 改变这个:

Intent intent = new Intent(OnLineForegroundService.this, NewOrderActivity.class);

到这里:

Intent intent = new Intent(getApplicationContext(), NewOrderActivity.class);

【讨论】:

以上是关于活动在 startActivity(intent) 后没有启动的主要内容,如果未能解决你的问题,请参考以下文章

为啥 context.startActivity(intent) 没有启动活动以及如何在 android 中处理异常?

类型活动中的方法 startactivity(intent,bundle) 不适用于参数 (int,intent)

在从 Fragment 内的 RecyclerView 的 ViewHolder 调用的 startActivity(intent) 中使用 putExtra 时,应用程序崩溃

无法解析方法 startActivity()

启动一个新的页面

Intent