当前位置: 首页 > 知识库问答 >
问题:

重新启动“主页”按钮上的活动,但…只是第一次

蓝夕
2023-03-14

我正在开发的应用程序在第一次安装时有一个奇怪的行为。如果用户第一次正常退出应用程序,它将永远按其应有的方式运行。如果用户在安装应用程序后第一次使用“主页”按钮,则会将应用程序视为应该再次重新启动主屏幕,并在旧屏幕之前启动活动的新版本。

因此,目前确实有两个问题。我似乎无法同时解决这两个问题。

  1. 当用户按下“主页”按钮时,防止应用程序在首次安装时关闭。

在清单文件中,我没有将launchMode属性定义为任何内容。因此,不应该有任何奇怪的行为作为这一结果。我现在已经尝试了应用程序的launchmode属性,看看是否可以让它按照预期的方式运行,但这里似乎有更多的内容,而不仅仅是正确地启动活动。就我所知,当按下home(主页)按钮时,应用程序没有理由在第一次关闭自己。

我也不在应用程序中使用onUserLeaveHint。我必须再次通过搜索项目来确定。因此,似乎根本没有试图覆盖home按钮。

即使在重新启动手机后,home(主页)按钮仍能正常工作。不确定是什么导致初始安装将home按钮视为从头开始应用程序的标志。

一旦用户第一次退出应用程序,问题就会永久解决。你有没有想过我应该去哪里?

最近,在应用程序中进行了一次搜索,以查看它是否只是因为SQLite数据库方法的onUpgrade()组件导致了一些奇怪的行为而触发的。

@Override
public void onUpgrade (SQLiteDatabase db, int oldVersion, int newVersion) {
                if (newVersion > oldVersion) {

           }
       }

或者在另一个可能触发清单文件更新的位置,如果我将APK的较新版本传递给已经具有比当前版本低的版本的设备。然而,代码的这一部分并没有让我相信它会影响任何与启动序列相关的东西。

下面提供了清单文件(名称已更改),用于应用程序中当前使用的内容。

<uses-sdk android:minSdkVersion="10" android:targetSdkVersion="10"/>

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<uses-permission android:name="com.android.vending.CHECK_LICENSE"></uses-permission>
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>

<uses-permission android:name="android.permission.VIBRATE" android:required="false"/>
<uses-permission android:name="android.permission.CAMERA" android:required="false"/>
<uses-feature android:name="android.hardware.camera" android:required="false"/>
<uses-feature android:name="android.hardware.camera.autofocus" android:required="false"/>

<application android:icon="@drawable/icon"
             android:label="@string/app_name"
             android:allowBackup="false"
             android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen"
             >
    <activity android:name=".MyMain"
              android:label="@string/app_name_with_version"
              android:screenOrientation="portrait"
              android:windowSoftInputMode="adjustPan"   />
    <activity android:name=".StartupActivity"
              android:label="@string/app_name"
              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=".SelectActivity"  
                android:label="@string/app_name_with_version"
                android:screenOrientation="portrait"/>
    <activity   android:name=".ImageSelectionActivity"
                android:theme="@android:style/Theme.Dialog"
                android:label="@string/app_name_with_version"
                android:screenOrientation="portrait"
                android:configChanges="orientation|keyboardHidden"/>            
    <activity   android:name=".DetailsActivity"
                android:label="@string/app_name_with_version"
                android:screenOrientation="portrait"/>
    <activity   android:name=".EMailActivity"   
                android:label="@string/app_name_with_version"       
                android:screenOrientation="portrait"/>
    <activity   android:name=".SendTo" 
                android:label="@string/share_label" 
                android:theme="@android:style/Theme.Dialog" >
        <INTENT-FILTER>  
            <ACTION android:name="android.intent.action.MAIN">  
            <CATEGORY android:name="android.intent.category.LAUNCHER"/>  
            <INTENT-FILTER>  
                <ACTION android:name="android.intent.action.VIEW">  
                <CATEGORY android:name="android.intent.category.DEFAULT">  
                    <CATEGORY android:name="android.intent.category.BROWSABLE">  
                    <DATA android:scheme="callback" android:host="twitter"/>  
                    </CATEGORY>  
                </CATEGORY>
                </ACTION>
            </INTENT-FILTER>
            </ACTION>
        </INTENT-FILTER>
    </activity>
    <activity   android:name=".CreateMyActivity"
                android:label="@string/create_account_label"
                android:screenOrientation="portrait"
                android:theme="@android:style/Theme.Dialog"/>
    <activity   android:name=".ViewInLayoutActivity"
                android:label="@string/app_name_with_version"   
                android:screenOrientation="portrait"/>
    <activity   android:name=".Preferences"
                android:label="@string/set_preferences" 
                android:screenOrientation="portrait"
                android:theme="@android:style/Theme.Dialog"/>
    <activity   android:name=".AboutActivity"   
                android:label="@string/app_name_with_version"       
                android:screenOrientation="portrait"/>
    <activity   android:name=".InteractiveActivity" 
                android:label="@string/app_name_with_version"
                android:screenOrientation="portrait"
                android:theme="@android:style/Theme.Dialog"/>   
    <activity   android:name=".AlertFailedCommunications"
                android:screenOrientation="portrait"
                android:label="@string/alert_account_label"
                android:theme="@android:style/Theme.Dialog"/>
</application>    

共有3个答案

东郭俊楠
2023-03-14

看起来问题是由应用程序的不同实例引起的。当用户单击应用程序图标时,第一个实例可能在安装程序的任务下启动,第二个实例在其自己的任务下启动。在用户看来,他/她似乎恢复了应用程序,但实际上他此时又启动了应用程序。

如果你想让你的应用程序只在它自己的任务中运行,一种可能的方法是添加

android:allowTaskReparenting="true"

到AndroidManifest的应用程序级别。安装后首次单击应用程序图标后,应用程序将移动到单独的任务。

焦宏硕
2023-03-14

为什么会这样,没有线索。但是我知道定制的Launcher有特定的launchModes设置。

例如ADW. Launcher:

android:clearTaskOnLaunch="true"
android:launchMode="singleTask" 

首页应用程序中的Android SDK示例:android-sdk\示例\android-16\Home\AndroidManifest.xml

android:launchMode="singleInstance"

引用Commonware:如何防止自定义HomeLauncher应用程序重启活动?

我将使用SDK中的Home示例应用程序,它使用singleInstance。奇怪的是,AOSP启动器使用singleTask

夏烨霖
2023-03-14

欢迎来到不断增长的用户名单,他们已经被这一个咬了。

这是一个众所周知且长期存在的Android bug。第一次从安装程序、web浏览器和IDE(IntelliJ、Eclipse等)启动应用程序的方式。请参阅很久以前提交的与问题相关的问题:

http://code.google.com/p/android/issues/detail?id=2373

http://code.google.com/p/android/issues/detail?id=26658

它仍然是破碎的,你无法阻止这一切的发生。你唯一能做的就是检测Android何时将你的根活动的第二个实例启动到现有任务中。您可以通过将此代码放入根活动的onCreate()中来完成此操作:

if (!isTaskRoot()) {
    // Android launched another instance of the root activity into an existing task
    //  so just quietly finish and go away, dropping the user back into the activity
    //  at the top of the stack (ie: the last state of this task)
    finish();
    return;
}
 类似资料:
  • 我正在制作一个应用程序,其中有一个“MainActivity.class”,它有一个按钮“Edit profile”,可以引导另一个活动,称为“Editprofile.class”。它(MainActivity)还有一个文本视图,显示一个字符串(名称)。 Editprofile.class接受来自用户的字符串,按下添加按钮后,新的字符串会更新到数据库中,替换以前的字符串。现在,当更新后,用户通过后

  • 我有一个活动,当我的应用程序首次启动时开始(只有一次)。该活动允许用户选择主题。然后当他们按下完成键时,我完成了这项活动。这会将用户引导到主活动。但是当用户按下返回按钮时,它会返回到第一次启动的活动(我使用完成()关闭的活动)。但我想要的是,应用程序应该关闭时,用户按下返回按钮从主活动(总是)。我在两个类中都重写了onBackPress。 这两个类中的onBackPressed方法如下所示: 主活

  • 我目前正在处理一个Android项目,当用户在使用对话框主题的活动上按后退按钮时,我遇到了问题。 基本上,我有一个活动,让我们称之为我的活动,第二个活动使用@android: style/Theme.Holo.Dialog称为MyDialog。 当MyDialog活动显示在屏幕上时,活动对话框在对话中按预期启动,但当用户按下返回按钮时,对话框活动按预期关闭,但启动活动即MyActive似乎结束了,

  • 当我在onSaveInstanceState方法中将数据成功保存到Bundle时,我无法找出为什么onCreate方法中的savedInstanceState总是为null。当我在AVD上运行我的程序并单击“上一步”按钮(销毁活动),然后通过单击其图标再次创建程序时,保存的状态始终为空。下面是一个测试这个问题的简单程序。 如果可能的话,告诉我如何解决这个问题。

  • 我已将设置为 样式表中的全局。现在每个活动都有相同的图标。 如何将操作栏中的图标更改为左箭头( 我尝试访问android。R、 可抽出式。ic\u menu\u back但我无法访问它(它似乎是私有的):

  • 我是android studio的新手,目前正在创建一个应用程序,它将从SQLite的现有数据库中检索数据。基于我发现的是创建一个布局文件(而不是通过创建新的空活动)来设计如何显示数据。但在布局中,我想要按钮打开新的活动,但不知何故它没有,我没有找到任何解决方案,到目前为止。而影像也没有出现。这是代码: DataPoi.java ListPoiAdapter.java 游乐场.java