23

私のアプリケーションは実行モード[フォアグラウンド]にあり、ユーザーはホームボタンをクリックします。これにより、アプリケーションがバックグラウンドになります[そしてまだ実行中です]。アプリケーションにアラーム機能があり、起動します。アラームが鳴ったときに、バックグラウンドで実行されているアプリケーションをフォアグラウンドで、最後の状態から取得したいと思います。

    <application
            android:name="com.abc.android.state.management.MainEPGApp"
            android:icon="@drawable/icon"
            android:label="@string/app_name"
            android:largeHeap="true"
            android:logo="@drawable/app_logo" >
            <activity
                android:name=".SplashScreen"
                android:label="@string/app_name"
                android:launchMode="singleTop"
                android:screenOrientation="nosensor"
                android:theme="@style/Theme.Sherlock" >
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        <activity
                    android:name=".Starter"
                    android:configChanges="orientation|screenSize"
                    android:screenOrientation="behind"
                    android:launchMode="singleTop"
                    android:uiOptions="none"
                    android:windowSoftInputMode="adjustPan" />
</application>
4

7 に答える 7

66
Intent intent = new Intent(context, MyRootActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(intent);

の開始アクティビティまたはルートアクティビティを使用する必要がありますMyRootActivity

これにより、実際に新しいアクティビティを作成することなく、既存のタスクが前面に表示されます。アプリケーションが実行されていない場合は、のインスタンスを作成してMyRootActivity起動します。

編集

Intent.FLAG_ACTIVITY_SINGLE_TOP私はそれを本当に機能させるためにインテントに追加しました!

2番目の編集

これを行う別の方法があります。ユーザーが利用可能なアプリのリストからアプリを選択したときにAndroidがアプリを起動するのと同じ方法で、アプリの「起動」をシミュレートできます。ユーザーがすでに実行されているアプリケーションを起動すると、Androidは既存のタスクをフォアグラウンドに移動します(これはあなたが望むものです)。このようにしてください:

Intent intent = new Intent(context, SplashScreen.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // You need this if starting
                                                //  the activity from a service
intent.setAction(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
startActivity(intent);
于 2012-08-22T14:26:31.230 に答える
11

私のために働く組み合わせは使用することです:

Intent bringToForegroundIntent = new Intent(context, RootActivity.class);
bringToForegroundIntent.setFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(bringToForegroundIntent);

ランチャーアイコンからアクティビティを開始するたびにデバイスのログを確認すると、これは、アプリを起動したり、ユーザーがホームボタンをクリックした場合にアプリをフォアグラウンドに戻したりするために渡されるインテントです。

于 2015-04-23T06:33:42.807 に答える
10

以下のコードを使用して、アプリケーションを前面に表示できます。

private void bringApplicationToFront()
    {

        Log.d(TAG, "====Bringging Application to Front====");

        Intent notificationIntent = new Intent(this, MainActivity.class);
        notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);
        try 
        {
            pendingIntent.send();
        }
        catch (CanceledException e) 
        {
            e.printStackTrace();
        }
    }
于 2015-09-23T10:04:16.527 に答える
9

アプリを前面に表示する新しい方法を見つけました。アイコンをクリックしてアプリケーションを起動するのを模倣します。

    PackageManager packageManager = context.getPackageManager();
    Intent intent = packageManager.getLaunchIntentForPackage(pkName);
    if (intent != null)
    {
            //模拟点击桌面图标的启动参数
            intent.setPackage(null);
         // intent.setSourceBounds(new Rect(804,378, 1068, 657));
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
           context.startActivity(intent);

    }

それは私にとってはうまくいきますが、パッケージがnullでなければならない理由を誰が教えてくれますか

于 2016-01-07T10:32:32.873 に答える
4

私のテストから、ランチャーの動作を模倣するための鍵は次のとおりです。

intent.setPackage(null);

Intent intent = packageManager.getLaunchIntentForPackage(pkName);

私の場合、このスレッドの他のメソッドは機能しません。

嘉慶の答えのおかげで、コメントする権利がないので、この答えを投稿します。この背後にあるロジックもわかりません。タスクの所有者に関連していると思います。誰もが知っている、知ってうれしいでしょう。

于 2017-05-08T09:03:54.880 に答える
4

ActivityManagerクラスを使用すると、実行中のタスクを前面に出すことができます

void bringToFront(){

 ActivityManager activtyManager = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
 List<ActivityManager.RunningTaskInfo> runningTaskInfos = activtyManager.getRunningTasks(3);
 for (ActivityManager.RunningTaskInfo runningTaskInfo : runningTaskInfos)
            {
              if (this.getPackageName().equals(runningTaskInfo.topActivity.getPackageName()))
                {
                     activtyManager.moveTaskToFront(runningTaskInfo.id, ActivityManager.MOVE_TASK_WITH_HOME);
                     return;
                 }
             }
}
于 2020-04-08T13:45:43.933 に答える
1

アラームについては、Androidサービスの開始を確認する必要があります

このサービスは、バックグラウンドで強制終了される可能性のあるアプリケーションよりも復元力が高く、アラームが鳴る時間になったときにアプリケーションを前面に表示する(または強制終了された場合は再起動する)意図を実行できます。

于 2012-08-22T14:24:59.313 に答える