Android应用的备用录入活动

时间:2015-01-20 22:44:47

标签: android android-activity

当用户首次运行我的应用程序时,我需要它们运行简短的设置/教程活动集。

如何设置我的应用以在首次运行时打开SetUpActivity而不是我的MainActivity?

4 个答案:

答案 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。