あなたはそれを殺すことができないことを知っている-Androidのマルチタスクについて話す

Androidで生き続けるというトピックは避けられません。アプリによっては、生き続けるのに苦労します。最近、Zhihuを開いたことがわかりましたが、最近のタスクではZhihuが表示されず、Zhihuを非常に強力にする方法を知っていました。次のNanBox  ブログからのシェアは、  最近のタスクで完璧な非表示を実現する方法を知る方法を明らかにします。

通常の時間にAPPを使用しているときに次の状況が発生したかどうかはわかりません。

これは最近Zhihuを使用したときに表示されました。タスクリストにZhihuが表示されていないことがわかりますが、明らかに実行中です。あなたは今それを開いて、大きな確率を見ることは正常であると知っています、理由は後で述べられます。

通常、APPプロセスを強制終了するための最も直接的な方法は、タスクリスト内の対応するタスクを削除することです。したがって、Baohuo Black Technologyは新しいアイデアを追加しました:アプリケーションがタスクリストに非表示の場合、ユーザーはそれを強制終了できませんか?

事前に説明するために、この記事ではキープアライブの方法については説明しません。これがどのように行われるかを説明し、これをAndroidマルチタスクについて説明します。そして、この経験のために、私は本当にうんざりしました。

それを殺す方法は?

タスクリストはAPPを強制終了する唯一の方法ではありません。まず、このアプリケーションを強制終了する方法を見てみましょう。

adb

adb shell psを使用 して、システムで現在実行されているすべてのプロセス表示でき  ますが、予想どおり、まだ実行中であることがわかりました。

次に、adb shell am force-stop com.zhihu.androidを使用し   て、プロセス強制終了できます。

システム設定

一般ユーザーにとって、まだ道はあります。システム設定を入力し、アプリケーション設定で知識を見つけて、強制をクリックして停止します。

でも、どちらの方法を使っても面倒なので、誰も参加しないように心から願っています。

excludeFromRecents

実際、Androidではタスクリストで非表示にすることができ、android:excludeFromRecents = "true"がリストで宣言されている限り、非常に簡単 です。

新しいプロジェクトを試して、MainActivityをこの構成に追加してみましょう。

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

これにより、タスクリストに表示されないという効果が得られます。

しかし、それを最初に開いたときにタスクリストに表示されるため、知るだけでは十分ではありません。以下では、マルチタスクの別の概念を紹介します。

taskAffinity

これは、現在実行中のアプリケーションではなく、現在実行中のタスクを表示するため、タスクリストと呼ばれます。デフォルトでは、1つのアプリケーションが1つのタスクに対応しているだけです。

各タスクには、タスク名として理解できるTaskAffinityがあります。デフォルトでは、TaskAffinityはアプリケーションのパッケージ名です。taskAffinity属性を使用して、アクティビティに異なるタスク名を構成し、APPに複数のタスクを設定できます。

excludeFromRecentsであろうとtaskAffinityであろうと、それらはスタック内のルートアクティビティに対してのみ有効であり、実際には、アクティビティではなくタスクスタックタスクで機能します。

たとえば、SecondActivityを追加すると、リストの構成は次のようになります。

<activity
    android:name=".MainActivity"
    android:label="Task 1"
    android:taskAffinity="com.nanbox.task1">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

<activity
    android:name=".SecondActivity"
    android:label="Task 2"
    android:launchMode="singleTask"
    android:taskAffinity="com.nanbox.task2" />

両方のアクティビティが有効になっている場合、2つのタスクがタスクリストに表示されます。

taskAffinityは、singleTaskと組み合わせて使用​​されることがよくあります。singleTaskアクティビティを開始すると、システムはまず現在のタスクと新しいtaskAffinityを比較します。これらが一致しない場合、アクティビティは新しいタスクで開始されます。

さらに、アプリケーションは複数のタスクを持つことができるだけでなく、異なるアプリケーションが同じタスクに属し、タスクがプロセスをまたぐことができます。そのような使用シナリオはほとんどないはずなので、ここでは詳細には触れません。

サンオペレーション

上記のマルチタスクに基づいて、アプリケーションに2つのタスクがあり、1つは表示され、もう1つは表示されない場合、ユーザーはタスクリストで表示されているタスクのみを強制終了でき、非表示のタスクは実行を継続できます。生き続ける?

試してみましょう。上記のコードですが、今回はタスクリストでタスク2を非表示にします。

<activity
    android:name=".MainActivity"
    android:label="Task 1"
    android:taskAffinity="com.nanbox.task1">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

<activity
    android:name=".SecondActivity"
    android:excludeFromRecents="true"
    android:label="Task 2"
    android:launchMode="singleTask"
    android:taskAffinity="com.nanbox.task2" />

アクティブ化されたSecondActivityを保存し、MainActivityで判断します。SecondActivityが既に存在する場合は、直接起動して、アプリケーションの最後の状態に戻します。

Activity activity = ActivityProvider.getActivity();
if (activity != null) {
    Intent intent = new Intent(this, activity.getClass());
    startActivity(intent);
    finishAndRemoveTask();
}

したがって、この効果があります:

繰り返しGIFを再生するのはあまりよくありません。興味がある場合は、確認してください。

タスク1は、最初のタスクリストに表示されます。タスク2を開始してタスク1を終了すると、タスクリストは空になりますが、デスクトップアプリケーションをクリックすると、実行中のタスク2に戻ることができます。

これが、最初の始動が正常であることを知ることが正常であり、使用後にのみ発生する可能性がある理由です。

488件のオリジナル記事を公開 85 件を賞賛 230,000回の閲覧+

おすすめ

転載: blog.csdn.net/Coo123_/article/details/105118513