4

私のアプリでは、最近使用したサードパーティのアクティビティをプログラムで前面に表示したいと考えています。ここで他の回答を見た後、最近のタスクのリストから返されたbaseIntentを使用してアクティビティを再起動しようとしましたが、他の何が起こっていてもアクティビティが前面に出ないようです。

私の最終的な目標は、着信画面を小さなオーバーレイに置き換えるアプリを作成して、ユーザーが電話を受けたときに使用しているアプリから完全に引き出されないようにすることです。デフォルトの着信画面を置き換えることができないことがわかったので (そうでない場合は、代わりにそうしたいのでお知らせください)、回避策として、最近使用したアプリを呼び出して、画面の前面に (着信画面をオーバーレイするため)、その上に自分のオーバーレイを表示します。

これが私が使用しているコードです(アクティビティはブロードキャストレシーバーから起動されます)

public class BringMRUAppToFront extends Activity
{
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);

        ActivityManager activityManager = (ActivityManager) getSystemService("activity");
        List<RecentTaskInfo> recentTasks = activityManager.getRecentTasks(1, ActivityManager.RECENT_WITH_EXCLUDED);
        if(recentTasks.size() > 2) {
            RecentTaskInfo recentTask = recentTasks.get(2);
            Intent testIntent = recentTask.baseIntent;
            Log.i("MyApp", "Recent task - " + recentTask.baseIntent.getComponent().getPackageName());

            testIntent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); 
            startActivity(testIntent);
        }
        finish();
    }
}

第三者の活動を前面に出す確実な方法はありますか? アクティビティはメモリ内にあることが保証されているため (メモリ内にない場合は、ホーム画面を表示するだけです)、そこに問題はないはずです。また、この場合、電話が鳴る直前に表示されていたアプリが表示されるだけなので、セキュリティ上の問題になるとは思いませんが、SDKで一般的にこれを開くとリスクが生じる可能性があることは理解しています. ..それが可能であることを願っています。

編集:私がやっていることを反映するためにコードを少し修正しました。目的のタスクは、ほとんどの場合、リストの 3 番目のタスクです。1 番目は現在のタスクで、2 番目は呼び出し中の電話のタスクです。タスクを前面に呼び出すことはできますが、常に同じ状態になるとは限りません (たとえば、ブラウザーの設定画面ではなく、ブラウザーのページに移動するなど)。最近のタスクリストはどのようにこれを行いますか?

4

3 に答える 3

7

Androidのソースコードを見てそれを理解しました-これは、Honeycombの前後の両方で[最近のタスク]画面が行うこととまったく同じです。

RecentTaskInfo recentTask = recentTasks.get(1); // task 0 is current task
// maintains state more accurately - only available in API 11+ (3.0/Honeycomb+)
if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB) {
    final ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
    am.moveTaskToFront(recentTask.id, ActivityManager.MOVE_TASK_WITH_HOME);
} else { // API 10 and below (Gingerbread on down)
    Intent restartTaskIntent = new Intent(recentTask.baseIntent);
    if (restartTaskIntent != null) {
        restartTaskIntent.addFlags(Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY);
        try {
            startActivity(restartTaskIntent);
        } catch (ActivityNotFoundException e) {
            Log.w("MyApp", "Unable to launch recent task", e);
        }
    }
}

これが正しく機能するには、権限android.permission.REORDER_TASKSが必要です。

于 2012-11-02T02:50:10.083 に答える
1

Android L から開始すると、getRecentTasks() はアプリケーション自身のタスクと、場合によってはその他の非機密タスク (ホームなど) を返すため、そのようなジョブを実行することはできません。

参照: https://developer.android.com/preview/api-overview.html#Behaviors

于 2014-07-03T04:27:41.313 に答える
-1

すべてのアクティビティからアクセスされるグローバル静的変数を使用し、その onPause でその変数をそのアクティビティ値に設定しないでください。たとえば、ActivityName という静的変数を配置しています。

public static String ActivityName = "";

すべてのアクティビティの onPause で、アクティビティ パッケージ名を割り当てるだけです。

@Override
public void onPause() {
    super.onPause();
    // The static global variable 
    com.pacakagename.Utls.ActivityName = "com.pacakagename.Act1";
}

そのため、いずれかのアクティビティが一時停止すると値が割り当てられ、最後に一時停止されたアクティビティがわかるようになり、Class.forName(ActivityName) を使用して再開できます。

于 2012-10-26T05:28:15.750 に答える