当用户首次运行我的应用程序时,我需要它们运行简短的设置/教程活动集。
如何设置我的应用以在首次运行时打开SetUpActivity而不是我的MainActivity?
答案 0 :(得分:2)
对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
标签。只需将该标签移动到应用程序打开时要启动的活动。如果您希望在打开应用程序时启动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
都会检查是否存在名为SharedPreference
的{{1}}。如果它 NOT ,则表示该应用程序之前从未启动过,并且firstLaunch
密钥已创建并添加到firstLaunch
;这也是您要从中发布教程SharedPrefernces
的地方。另一方面,如果Activity
firstLaunch
确实存在,则意味着该应用程序之前已启动,因此您只需启动标准SharedPreference
。
答案 1 :(得分:1)
您可以使用Launcher活动在执行逻辑后打开任何活动,例如,如果用户第一次打开了应用程序并且没有任何注册数据,或者您可以将他发送到Intro然后如果在执行Intro之后打开应用程序(你可以在首选项中保存一些变量),你可以将它们重定向到另一个活动,比如Main或者其他什么,我在我运行的应用程序中这样做,我认为其他人也这样做事情也(如电报)。
这是我的意思的一个例子。
<?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,然后在启动器中,您可以使用要从这些共享意图执行的操作打开活动。
然后从那个Launcher活动中你可以得到类似的东西......
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 repo以了解其运行示例。希望对你有所帮助。
答案 2 :(得分:0)
为什么不继承android.app.Application
并决定在Activity
期间显示哪个onCreate()
。
注意:您还应将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"
。
答案 3 :(得分:0)
您可以使用SharedPreferences来实现此目的。只需将您的SetupActivity声明为清单中的默认活动即可。然后在onCreate方法上,检查SharedPreferences中是否已初始化一个var,如果是这种情况,则为MainActivity创建一个Intent。
如果尚未初始化,请继续安装过程,一旦完成初始化SharedPreferences中的var。