【问题标题】:How do I make an activity the first activity launched but only on the first run of the application如何使活动成为启动的第一个活动,但仅在应用程序的第一次运行时
【发布时间】:2015-10-06 17:50:49
【问题描述】:

我需要我的应用程序有一个活动(注册)是第一次安装应用程序时启动的第一个活动,但是在初始运行之后它将有一个不同的活动(LogInActivity)是第一个启动的活动......我有将代码放入其中使注册活动只运行一次,但我不知道如何更改我的清单以获得所需的结果。我尝试将 MAIN 操作移动到 Register 活动,但这会导致它在每次运行我的应用程序时启动。当 MAIN 操作在 LogInActivity 中时,Register 根本不会运行。我还尝试在我的清单中添加一个 DEFAULT 操作,在我有 MAIN 操作的相反活动下,但这也不起作用,并且在进一步研究 DEFAULT 的作用后,我不相信这是我需要的。那么我还需要向我的 XML 添加其他意图吗?

清单:

<application
    android:allowBackup="true"
    android:icon="@drawable/skey"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >

 ///////////FIND INFO ACTIVITY
    <activity
        android:name=".FindInfoActivity"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.LogInActivity" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

  //////////LOG IN ACTIVITY
    <activity
        android:name=".LogInActivity"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.LogInActivity" />
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

  //////////REGISTER ACTIVITY
    <activity
        android:name=".Register"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.LogInActivity" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

</manifest>

【问题讨论】:

    标签: android xml android-activity


    【解决方案1】:

    不要有三个单独的 LAUNCHER 活动,除非您希望用户能够从主屏幕从三个单独的项目启动应用程序(这有有效的用例,但不是这样)。

    拥有一个处理启动应用程序的活动。它检查您的 SharePreferences 中的布尔值,然后从那里开始适当的活动。然后只需完成 Activity,这样用户就不会在用户按下“返回”时重新打开它。

    public class LauncherActivity extends Activity {
    
       @Override
       public void onCreate(Bundle icicle) {
         super.onCreate(icicle);
         if (firstTimeRunning()) {
             // start register activity.
         } else {
             // start login activity.
         }
         finish();
       }
    }
    

    在 Manifest 中,只需将此 Activity 设置为:

    <activity android:name=".LauncherActivity">
       <intent-filter>
          <action android:name="android.intent.action.MAIN"/>
          <category android:name="android.intent.category.DEFAULT"/>
          <category android:name="android.intent.category.LAUNCHER"/>
       </intent-filter>
    </activity>
    

    您的注册活动或登录活动不需要任何 IntentFilter,因为它们永远不会通过隐式意图打开,也没有任何特殊权限(据我所知)。

    【讨论】:

    • 所以你是说我需要在每次 MAIN 时创建我想要启动的活动并检查同一活动中的共享首选项?
    • 是的。您无法更改清单。
    • 效果很好......至少在模拟器中......我正要尝试在真实设备上安装,但我现在的问题是应用程序如何知道何时启动注册活动该应用程序是第一次运行?我知道它是如何知道在其余时间首先运行 LogInActivity 但感到困惑。
    • 从逻辑上讲,它会像这样工作。首次安装应用程序时,应用程序没有 SharePreferences 或本地存储。如果您检查您的状态,它将返回 false 意味着布尔值未设置或用户从未打开应用程序。在注册活动中,让用户做他必须做的任何事情,然后将 SharePreferences 中的布尔值设置为 true。然后,从那时起,该布尔值将始终为真。
    • 当然,如果他们重新安装应用程序或清除数据,用户将重新注册。这无法在应用程序内解决,需要服务器解决方案(99.9% 的情况下也没什么大不了的)。
    【解决方案2】:

    使用 SharedPreference。当您第一次打开应用程序时,请执行以下操作:

    SharedPreferences shared;
    shared=getSharedPreferences("com.example", Context.MODE_PRIVATE);
    shared.edit().putBoolean("first_time",true).apply();
    

    在您的第一个活动的onCreate() 中执行以下操作:

    SharedPreferences shared;
    shared=getSharedPreferences("com.example", Context.MODE_PRIVATE);
    if(shared.getBoolean("first_time",false)){
    startActivity(new Intent(FirstActivity.this, NewFirstActivity.class));
    finish();
    }
    

    是“存储”数据和状态的最简单方法。 SharedPreference 也适用于字符串、Int 值等(如果您不想要布尔值)

    【讨论】:

    • 我已经设置了共享首选项...请在尝试回答问题之前阅读整个帖子,.. 在我的帖子中我声明:我已将代码放入仅用于注册活动运行一次,但我不知道如何更改清单以获得所需的结果。
    • 但是您不能...您只有 1 个启动活动并声明其余的...他们甚至没有订单(如果您只想打开订单)。这就是为什么 SharedPreference 是最好的选择。
    【解决方案3】:

    在您的Manifest 中,您应该只有一个启动器类,在同一个类的onCreate 方法中检查是否已登录(SharedPreference)。如果是,则使用Intent 启动 HomeActivity,否则如果用户已注册并注销,则启动 LoginActivity。当用户登录时,将帐户 ID/会话详细信息/用户详细信息保存在 SharedPreference 中,您可以在启动器类中验证以启动特定活动。

    【讨论】:

    • 我认为启动器是课程启动期间所必需的。我仍然需要其他课程才能启动,而不是首先启动。我认为 MAIN 控制了首先启动的内容?
    • @thatdude1087,你的理解是错误的。启动器适用于启动器中出现的每个图标。如果您有两个启动器活动,那么两个启动器图标将出现在主 Android 启动器中。如果你有三个,那么启动器中会出现三个图标,依此类推。
    【解决方案4】:

    正如 Mariano 所说,您可以使用 SharedPreferences。如果您不想在启动时打开设置,您可以使用 Dialog 让用户决定是转到您的设置还是什么都不做。

    顺便说一句,我认为使用 SharedPreferences 来存储登录信息(用户名和密码)是最好的做法,而不是每次启动应用程序时都询问这些值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-24
      相关资源
      最近更新 更多