gpt4 book ai didi

android - Android Java 应用程序中的实例计数违规

转载 作者:行者123 更新时间:2023-11-29 21:41:52 24 4
gpt4 key购买 nike

我正在开发 Android 应用程序。抽象地说,这个应用程序有一个 UI 以便与用户交互,它还与远程服务交互。远程服务向 Android 启动器栏添加通知,此通知允许重新显示 UI。该应用程序和服务在同一个包中。服务通知函数代码:

private void showNotification (String contentText) {
Intent intent = new Intent (this, my_app.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.addFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);
PendingIntent pendingIntent = PendingIntent.getActivity(
this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
mNotification = new Notification.Builder(this)
.setContentIntent(pendingIntent)
.setSmallIcon(ICON)
.setWhen(System.currentTimeMillis())
.setContentTitle(CONTENT_TITLE)
.setContentText(contentText)
.setAutoCancel(false)
.setOngoing(true)
.build();
mNotificationManager.notify(NOTIFICATION_ID, mNotification);
}

注意:这是方法的当前版本...之前我也尝试过以下 FLAGS

   intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
intent.addFlags(Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY);

应用 list 包含以下配置:

    <application
android:icon="@drawable/icon"
android:label="@string/app_name"
android:allowBackup="true"
android:launchMode="singleTop"
android:uiOptions="splitActionBarWhenNarrow"
android:allowTaskReparenting="true">...</application>

注意:我也尝试了其他的礼节,但这些不会产生预期的影响......

当应用程序启动但不再显示时,可以使用启动器栏的通知或使用“应用程序列表”中的应用程序条目重新显示它,但是当我执行以下场景时,UI 显示两次:

  1. 从列表中启动应用程序
  2. 在主页按钮上贴上胶带
  3. (重新)显示使用通知的应用程序==> UI 重新正确显示
  4. 在主页按钮上贴上胶带
  5. (重新)显示使用“应用程序列表”的应用程序==> 显示一个新的 UI 实例

场景日志:

#start from applications list
I/ActivityManager( 504): START u0 {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.domain.my_app/.My_App bnds=[40,833][200,1033]} from pid 871
I/my_app( 6915): onCreate
I/my_app::Service( 6930): onCreate
I/my_app( 6915): onResume
#tape the home button
I/my_app( 6915): onPause
#restart from notification in launcher bar
I/ActivityManager( 504): START u0 {flg=0x34400000 cmp=com.domain.my_app/.My_App bnds=[0,102][720,230]} from pid -1
I/my_app( 6915): onResume
#tape the home button
I/my_app( 6915): onPause
#start from application list
I/ActivityManager( 504): START u0 {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.domain.my_app/.My_App bnds=[40,833][200,1033]} from pid 871
I/my_app( 6915): onCreate
I/my_app( 6915): onResume
#tape the home button
I/my_app( 6915): onPause
#restart from notification in launcher bar
I/ActivityManager( 504): START u0 {flg=0x34400000 cmp=com.domain.my_app/.My_App bnds=[0,102][720,230]} from pid -1
I/PSI Recorder( 6915): onResume
#it is necessary to use two times the my_app quit button in order to exit the application, and then in log, I noted the following error
E/StrictMode( 6915): class com.domain.my_app; instances=2; limit=1
E/StrictMode( 6915): android.os.StrictMode$InstanceCountViolation: class com.domain.my_app; instances=2; limit=1

我阅读了很多关于应用程序、远程服务和通知的东西、技巧等,但我无法理解为什么当应用程序从列表中重新启动时会重新创建 UI,并且只有在之前从通知中重新显示它...注意:如果未将 FLAG_ACTIVITY_NEW_TASK 标志添加到 Intent ,则会记录以下警告,并且它不会改变观察到的行为...

W/ActivityManager(  504): startActivity called from non-Activity context; forcing Intent.FLAG_ACTIVITY_NEW_TASK for: Intent { flg=0x24400000 cmp=com.domain.my_app/.My_App bnds=[0,102][720,230] }

我将不胜感激。

谢谢。最好的问候,

编辑:这是我的错,android:launchMode="singleTop"属性应该在“activity”元素中,而不是“application”Manifest 字段:/

我搬家了,它起作用了

    <application
android:icon="@drawable/icon"
android:label="@string/app_name"
android:allowBackup="true">
<activity
android:name=".my_app"
android:configChanges="orientation"
android:label="@string/app_name"
android:launchMode="singleTop"

最佳答案

我认为问题的根源在于您的 Intent 标志组合。为了帮助您调试它,请尝试实现 onNewIntent()在您的 Activity 中使用方法,并记录它收到的每个 Intent ,如下所示:

protected void onNewIntent(Intent intent){
super.onNewIntent(intent);
Log.i("my_app", "New intent with flags "+intent.getFlags());
}

这应该允许您在日志中查看哪些标志导致对 onCreate() 的第二次调用。

至于 StrictMode 实例计数违规,我认为不值得像解释的那样进行调查 here .

编辑尝试仅使用标志 Intent.FLAG_ACTIVITY_NEW_TASK,例如,删除其他三个标志。此外,将 android:launchMode 保持为 singleTop。

关于android - Android Java 应用程序中的实例计数违规,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16857546/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com