20

現在、アプリに表示されるスプラッシュ スクリーンがあります。ただし、待機中の収集または処理するデータがない場合は、最初のアクティビティに直接進みたいと思います。スプラッシュスクリーンを点滅させずにそれを行う方法はありますか?

スプラッシュスクリーン部分の AndroidManifest.XML は次のとおりです。

<activity android:name="com.example.SplashScreenActivity"
        android:label="@string/app_name"
        android:noHistory="true" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
4

4 に答える 4

26

私が過去に成功したことは、主な活動として目に見えない活動を作成することです。コンストラクターで「正しい」アクティビティを起動するため、ユーザーに表示されることはありません。

このため、ビューをロードしないため、アクティビティを「非表示」としてテーマ化する必要はありません。

内部には、ユーザーに最初に表示するアクティビティを決定するロジックを配置します。これは私のユースケースでは完璧に機能します - 試してみてください。


マニフェスト宣言 (noHistory="true"パラメーターに注意してください):

    <activity
        android:name=".activity.EntryActivity"
        android:noHistory="true" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

EntryActivity クラス:

public class EntryActivity extends Activity 
{ 

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

        // launch a different activity 
        Intent launchIntent = new Intent(); 
        Class<?> launchActivity; 
        try
        { 
            String className = getScreenClassName(); 
            launchActivity = Class.forName(className); 
        } 
        catch (ClassNotFoundException e) 
        { 
            launchActivity = DefaultHomeActivity.class; 
        } 
        launchIntent.setClass(getApplicationContext(), launchActivity); 
        startActivity(launchIntent); 

        finish(); 
    } 

    /** return Class name of Activity to show **/
    private String getScreenClassName() 
    {       
        // NOTE - Place logic here to determine which screen to show next
        // Default is used in this demo code
        String activity = DefaultHomeActivity.class.getName(); 
        return activity; 
    } 

} 
于 2013-07-04T19:39:18.277 に答える
2

ランチャーがマニフェストで指定したアクティビティを開始する場合、そのアクティビティ (または別のアクティビティ) を開始するかどうかについて条件を設定することはできません。

したがって、Richard Le Mesurier と dors が提案するオプションが残されています。

  1. メイン アクティビティを開始し、必要に応じてスプラッシュ アクティビティを起動します
  2. GUI を使用しないアクティビティ (レイアウト ファイルなし) を開始し、ユーザーに表示するアクティビティを決定します。

2 番目のオプションをお勧めします。または、とにかく Fragments を導入する予定がある場合は、ここで使用してください。

  1. を使用しFragmentsます。Fragment プレースホルダーを持つメイン アクティビティを開始します。スプラッシュ スクリーンを表示する必要がある場合は、そのアクティビティで SplashScreenFragment を読み込みます。それ以外の場合は、ユーザーにとって最初の有用な画面を構成する Fragment を読み込みます。

余談ですが、スプラッシュ スクリーンの使用は推奨されません。ユーザーとしては、ほとんどの静的 UI コンポーネントがすぐに読み込まれるメインのアクティビティと、何かが読み込まれている/更新されていることを示す画面上の表示を確認したいと思います。

于 2013-07-04T19:48:17.720 に答える
1

次のようなことができます。

  1. スプラッシュ スクリーンが主なアクティビティ (ランチャー カテゴリ)
  2. スプラッシュ スクリーンがデータをロードできる場合 (またはスプラッシュ スクリーンが行うものは何でも)、それを実行します。終了後、spalsh 画面を閉じ (finish() を呼び出します)、実際の最初のアクティビティを開始し、インテント エクストラとしてデータを渡します。
  3. スプラッシュスクリーンがデータを読み込めない場合、または (またはスプラッシュスクリーンが行うものは何でも)、インテントを使用して次のアクティビティを開始し、finish() を呼び出してスパルシュ スクリーン アクティビティを終了します。

したがって、アプリのワークフローは次のようになります。

  1. ランチャーアイコンをクリックします
  2. スプラッシュ スクリーン アクティビティは常に開始されます
  3. spalsh 画面を読み込めない場合、アクティビティはすぐに終了し、別のアクティビティが開始されます。スプラッシュ スクリーン アクティビティをすぐに finish() しても、アプリ ユーザーはスプラッシュ スクリーン アクティビティに気付かないでしょう。この場合、アクティビティは画面に表示されないためです。
于 2013-07-04T16:54:28.603 に答える
1

私の知る限り、メインのアクティビティは 1 つしかありません。

この問題が発生したときに私がしたことは、常にメイン アクティビティ (スプラッシュではなく) を開始することであり、その onCreate() メソッドで、必要に応じてスプラッシュ スクリーンを開始します。

于 2013-07-04T16:32:32.187 に答える