2015-01-20 26 views
0

當用戶第一次運行我的應用時,我需要他們運行一組簡短的安裝/教程活動。Android應用的替代入口活動

如何設置我的應用程序以便在第一次運行時打開SetUpActivity而不是MainActivity?

回答

1

例如,如果用戶第一次打開該應用程序,並且它沒有任何註冊數據或任何您可以將其發送給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> 

用這個例子也將趕上分享圖像和文本的任何意圖,然後在你的發射器,你可以用你想從這些股票的意圖執行的操作打開相應的活動。

然後從啓動活動,你可以有這樣的事情......

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); 


    } 
} 

這樣,你可以有你想要的任何情況下,你的應用程序靈活的開始......您可以檢查電報GitHub庫也爲他們的運行示例。希望它能幫助你。

0

爲什麼不從android.app.Application繼承並決定在onCreate()期間顯示哪個Activity

注意:您也應該將manifest.xmlandroid: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"的使用。

+0

你能解釋一下,我可以通過覆蓋Application類中的onCreate()來選擇哪個Activity? – 2015-01-20 22:55:45

+0

@WiseShepherd看到我的更新。 – Leigh 2015-01-20 23:15:40

0

您可以使用SharedPreferences來實現此目的。只需將您的SetupActivity聲明爲清單中的默認活動即可。然後在你的onCreate方法上,檢查SharedPreferences中的一個var是否已經初始化,如果是這樣的話,爲你的MainActivity創建一個Intent。

如果尚未初始化,請繼續安裝過程,一旦完成,請在SharedPreferences中初始化var。

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> 

正如你可以在上面的例子中看到,當應用程序啓動,因爲它具有android.intent.action.MAIN標籤ActivityToStart將打開。只需將該標籤移動到應用程序打開時要啓動的活動即可。如果你想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一次,則需要使用SharedPreferencesSharedPreferences允許您保存可在應用程序中全局訪問的值。一個簡單的方法就是設置一個簡單的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題爲firstLaunch存在。如果它確實是不是,那意味着應用程序以前從未啓動過,並且firstLaunch密鑰已創建並添加到SharedPrefernces;這也是你想從中啓動你的教程Activity的地方。另一方面,如果firstLaunchSharedPreference確實存在,這意味着應用程序已經啓動之前,所以你只需開始你的標準Activity

+0

謝謝你的回答,但我不認爲你理解這個問題。我只想在第一次運行時修改入口點,以便我可以運行設置屏幕。您的解決方案會更改每個應用運行的入口點。 – 2015-01-20 23:14:50

+0

我明白了。我修改了我的答案 – Willis 2015-01-21 16:15:34