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
。
另一方面,如果您希望只启动一次 Activity
,SharedPreferences
将是您的最佳选择。 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
将在每次启动应用程序时检查是否存在名为 firstLaunch
的 SharedPreference
。如果是 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 回购以获取他们的 运行 示例。希望对你有帮助。
当用户首次 运行 使用我的应用程序时,我需要他们 运行 通过一组简短的 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
。
另一方面,如果您希望只启动一次 Activity
,SharedPreferences
将是您的最佳选择。 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
将在每次启动应用程序时检查是否存在名为 firstLaunch
的 SharedPreference
。如果是 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 回购以获取他们的 运行 示例。希望对你有帮助。