Android 应用的备用条目 activity

Alternate entry activity for Android app

当用户首次 运行 使用我的应用程序时,我需要他们 运行 通过一组简短的 setup/tutorial 活动。

如何设置我的应用程序以首先 运行 打开 SetUpActivity 而不是 MainActivity?

为什么不继承 android.app.Application 并决定在 onCreate() 期间显示哪个 Activity

注意:您还应该将 manifest.xml android:name 标签更改为 .MyAppplication

像这样的东西:

扩展 Application:

public class MyAppplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();

        // Get value from data store
        boolean showTutorial = true;

        if (showTutorial) {
            Intent intent = new Intent(this, SettingsActivity.class);
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(intent);
        } else {
            Intent intent = new Intent(this, SettingsActivity.class);
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(intent);
        }
    }
}

更新您的 manifest.xml

 <application
    android:name=".MyAppplication"
    android:allowBackup="true"
    android:icon="@drawable/icon64"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name=".screens.SplashScreenActivity"
        android:label="@string/title_activity_splash_screen"
        android:screenOrientation="portrait"
        android:theme="@style/Theme.Splash" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

注意: android:name=".MyAppplication".

的用法

您可以使用 SharedPreferences 来实现这一点。只需在清单中将您的 SetupActivity 声明为默认值 activity 即可。然后在您的 onCreate 方法上,检查 SharedPreferences 中的一个 var 是否已初始化,如果是这样,请为您的 MainActivity 创建一个 Intent。

如果尚未初始化,请继续安装过程,完成后在您的 SharedPreferences 中初始化 var。

AndroidManifest.xml 文件进行简单编辑即可解决问题:

<application
    android:allowBackup="true"
    android:icon="@drawable/app_icon"
    android:label="@string/app_name">
    <activity
        android:name=".ActivityToStart"
        android:label="@string/activity_helmet_remote_name"
        android:theme="@style/themeLight">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity
        android:name=".AlternateActivity1"
        android:theme="@style/themeLight">
    </activity>
    <activity
        android:name=".AlternateActivity2"
        android:theme="@style/themeLight">
    </activity>
</application>

如您在上面的示例中所见,ActivityToStart 将在应用程序启动时打开,因为它具有 android.intent.action.MAIN 标签。只需将该标签移动到应用程序打开时要启动的 activity。如果您希望 AlternativeActivity1 在您打开应用程序时启动,那么您的 AndroidManifest.xml 文件将如下所示:

<application
    android:allowBackup="true"
    android:icon="@drawable/app_icon"
    android:label="@string/app_name">
    <activity
        android:name=".ActivityToStart"
        android:label="@string/activity_helmet_remote_name"
        android:theme="@style/themeLight">
    </activity>
    <activity
        android:name=".AlternateActivity1"
        android:theme="@style/themeLight">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity
        android:name=".AlternateActivity2"
        android:theme="@style/themeLight">
    </activity>
</application>

您还想确保移动 LAUNCHER 行...

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

到您希望在打开应用程序时启动的 Activity,因为这用于向 Android 启动器注册默认 Activity

另一方面,如果您希望只启动一次 ActivitySharedPreferences 将是您的最佳选择。 SharedPreferences 允许您保存可在您的应用程序中全局访问的值。一个简单的方法是设置一个简单的 Activty,你每次都启动它,它检查是否应该启动教程或者是否应该启动你的主要 Activity。类似于以下内容:

public class StartupActivity extends Activity
{
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        /** Create the Activity */
        super.onCreate(savedInstanceState);
        setContentView(R.layout.startup_activity);

        SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
        if (!sharedPreferences.contains("firstLaunch"))
        {
            // Add SharedPreferences key ("firstLaunch")
            SharedPreferences.Editor editor = sharedPreferences.edit();
            editor.putInt("firstLaunch", 1);
            editor.commit();

            // Launch tutorial Activity here...
        }
        else
        {
            // "firstLaunch" preference exists, which means application has been launched before
            // Launch primary activity here...
        }
}

上面的 Activity 将在每次启动应用程序时检查是否存在名为 firstLaunchSharedPreference。如果是 NOT,则意味着该应用程序之前从未启动过,并且会创建 firstLaunch 键并将其添加到 SharedPrefernces;这也是您要从中启动教程 Activity 的地方。另一方面,如果 firstLaunch SharedPreference 确实存在,则意味着该应用程序之前已启动,因此您只需启动标准 Activity.

您可以让启动器 activity 在执行逻辑后打开任何 activity,例如,如果用户是第一次打开应用程序并且它没有任何注册数据或无论您可以将他发送到 Intro,然后如果应用程序在 Intro 执行后打开(您可以在首选项中保存一些变量),您可以将它们重定向到另一个 activity,如 Main 或其他东西,我这样做在我有 运行 的应用程序中,我认为其他一些人也做同样的事情(比如 Telegram)。

这是我的意思的一个例子。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.company.app" >
<application
    android:name=".App"
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:hardwareAccelerated="true"
    android:label="@string/app_name"
    android:theme="@style/AppTheme">
    <activity android:name=".activity.Launcher"
              android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
              android:hardwareAccelerated="true"
              android:launchMode="singleTask"
              android:windowSoftInputMode="adjustPan">
              <intent-filter>
                  <action android:name="android.intent.action.MAIN" />
                  <category android:name="android.intent.category.LAUNCHER" />
                  <category android:name="android.intent.category.MULTIWINDOW_LAUNCHER" />
              </intent-filter>
        <intent-filter>
            <action android:name="android.intent.action.SEND"/>
            <category android:name="android.intent.category.DEFAULT"/>
            <data android:mimeType="image/*"/>
        </intent-filter>
        <intent-filter>
            <action android:name="android.intent.action.SEND"/>
            <category android:name="android.intent.category.DEFAULT"/>
            <data android:mimeType="video/*"/>
        </intent-filter>
        <intent-filter>
            <action android:name="android.intent.action.SEND_MULTIPLE"/>
            <category android:name="android.intent.category.DEFAULT"/>
            <data android:mimeType="image/*"/>
        </intent-filter>
        <intent-filter>
            <action android:name="android.intent.action.SEND"/>
            <category android:name="android.intent.category.DEFAULT"/>
            <data android:mimeType="text/plain"/>
        </intent-filter>
        <intent-filter>
            <action android:name="android.intent.action.SEND"/>
            <category android:name="android.intent.category.DEFAULT"/>
            <data android:mimeType="*/*"/>
        </intent-filter>
        <intent-filter>
            <action android:name="android.intent.action.SEND_MULTIPLE"/>
            <category android:name="android.intent.category.DEFAULT"/>
            <data android:mimeType="*/*"/>
        </intent-filter>
        <intent-filter>
            <action android:name="android.intent.action.VIEW"/>
            <category android:name="android.intent.category.DEFAULT"/>
            <data android:mimeType="vnd.android.cursor.item/vnd.org.telegram.messenger.android.profile"/>
        </intent-filter>
        <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:host="telegram.me" android:scheme="http" />
            <data android:host="telegram.me" android:scheme="https" />
        </intent-filter>
        <intent-filter android:icon="@drawable/ic_launcher" android:priority="1">
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.BROWSABLE" />
            <category android:name="android.intent.category.DEFAULT" />
            <data android:scheme="tg" />
        </intent-filter>
    </activity>
</application>
</manifest>

示例中的这还将捕获任何共享图像和文本的 Intent,然后在您的启动器中,您可以打开 activity,其中包含您希望从这些共享 Intent 执行的操作。

然后从那个启动器 activity 你可以有这样的东西...

package com.company.app.activity;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;

/**
 * Created by eefret on 23/12/14.
 */
public class Launcher extends Activity{

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // be sure to get your preference accordingly
    if(somePreference == true){
        startActivity(new Intent(this, MainActivity.class));
    }
    Intent intent = new Intent(this, IntroActivity.class);
    startActivity(intent);


    }
}

这样你就可以在任何你想要的情况下灵活地启动你的应用程序...你也可以查看 Telegram github 回购以获取他们的 运行 示例。希望对你有帮助。