15

3つの異なるケースがあります:

1)ユーザーがアプリを起動し、アプリ内を移動してホームキーを押し、アプリアイコンをもう一度クリックしてアプリを再度起動します。

2)ユーザーがアプリを起動し、アプリ内を移動してホームキーを押し、[最近]を選択し、アプリをクリックしてアプリを再度起動します。

3)ユーザーがアプリを起動し、その中を移動し、アプリ内の何か(リンク付きのTextView)をクリックすると、別のアプリ(Eメールなど)が呼び出され、ユーザーが[戻る]ボタンをクリックすると、アプリに戻ります。

フラグ「clearTaskOnLaunch」フラグについて知っています。これはケース#1を解決します。

フラグ「excludeFromRecents」について知っています。これはケース#2を解決します(最もユーザーフレンドリーなソリューションではないかもしれませんが、機能します)。

ケース#3はどうですか?現在、回避策があります。ただし、別のアプリにつながる可能性のあるすべてのアクティビティにそれを配置する必要があります。(そのようなすべての活動でそれを処理せずに)それを解決するためのより良い方法があるかどうか疑問に思います。

4

9 に答える 9

6

これは、アプリケーション レベルで処理する必要があります。

API レベル 14 では、ActivityLifeCycleCallback を Application クラスに登録できます。

public void registerActivityLifecycleCallbacks (Application.ActivityLifecycleCallbacks callback)

これを使用して、アプリケーション レベルで、どのアクティビティが破棄、一時停止、再開などされているかを知ることができます。アクティビティが一時停止され、新しいアクティビティが作成/再開されていない場合は、アクティビティ スタックをクリアして再起動する必要があります。あなたの開始活動

14 未満の SDK バージョンを対象とする場合は、独自のメソッドを実装して、どのアクティビティが作成/再開され、一時停止されたかを把握し、アクティビティが一時停止されるたびに同じことを行い、新しいアクティビティが作成/再開されないようにする必要があります。

于 2012-05-09T20:27:24.190 に答える
4

同様の質問がすでに出されているようです。OPが実用的な解決策を思いついたようです。「子アクティビティ」を折りたたむにはどうすればよいですか?

編集: ボタンを使用する代わりに、ブール値を使用して、メイン アクティビティに折りたたむ必要があるかどうかを判断できます。ルート アクティビティを Activity から拡張し、子アクティビティを CollapsableActivity から拡張します。これをすべてのケースで機能させるために、startOutsideActivity() と startOutsideActivityForResult() を追加しました。

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;

public class CollapsableActivity extends Activity {
    private boolean returnToRoot;
    public static final int COLLAPSE_BACK = -1; // something other than RESULT_CANEL (0)

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        returnToRoot = true;
    }

    @Override
    protected void onStart() {
        super.onStart();
        returnToRoot = true;
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        // start collapsing the stack
        if (returnToRoot) {
            setResult(COLLAPSE_BACK);

            finish();
        }
    }

    @Override
    public void startActivityForResult(Intent intent, int requestCode) {
        super.startActivityForResult(intent, requestCode);
        returnToRoot = false;
    }

    public void startOutsideActivityForResult(Intent intent, int requestCode) {
        super.startActivityForResult(intent, requestCode);
        returnToRoot = true;
    }

    @Override
    public void startActivity(Intent intent) {
        // call startActivityForResult to make sure and catch the collapse condition
        super.startActivityForResult(intent, 0);   
        returnToRoot = false;
    }

    public void startOutsideActivity(Intent intent) {
        super.startActivity(intent);    
        returnToRoot = true;
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if (resultCode == COLLAPSE_BACK) {
            returnToRoot = true;
        }
   }
}

これは、あなたがリストしたすべてのケースで適切に機能しました。唯一の違いは、アプリから離れるときに startOutsideActivity() または startOutsideActivityForResult() を呼び出す必要があることです。個人的には、これにより意図が明確になると思います。それが役に立てば幸い!

于 2012-05-06T17:39:48.083 に答える
4

1)public static normalPause = trueクラスで変数を定義します。

2)onPauseすべてのアクティビティのメソッドでfalseを設定します(心配です。通常の一時停止ではない可能性があります)。

2)onCreateすべてのアクティビティのメソッドでtrueに設定します(心配しないでください。通常の一時停止を行っています)。

3)onResumeあなたのすべての活動の中で:

if(!Utilities.normalPause)
{
    this.finish()
}

楽しみ!

于 2012-05-08T06:04:38.727 に答える
1

おそらく、android:noHistoryあなたが探しているものです。この属性を除くすべてのアクティビティを宣言すると、ユーザーがアクティビティStartupActivityから離れたときにアクティビティが終了し、表示されるだけStartupActivityになります。

于 2012-05-07T07:18:20.053 に答える
1

この手順を試すことができます:

  1. StartupActivityで1 つのboolean静的フラグisFinishをデフォルトの false 値で使用します。
  2. StartupActivity の onCreate() で isFinishfalse設定ます。
  3. プロジェクト内のすべてのアクティビティのonResume()メソッドに以下のコードを記述します。

    if(isFinish)
    {
       finish();
    }
    
  4. メールやブラウザなどのネイティブ アプリを開くときは、isFinish値をtrueに設定します。

また

5. バックプレスでアプリケーションを閉じたいときはいつでも、 onBackPress() メソッドでisFinish値をtrueに設定します。

ケース 6: Android ブラウザがリンクをクリックして開く場合、以下のコードを使用するのは onPause() メソッドです

if(isBrowserRunning("com.android.browser"))
{
   isFinish = true;
    finish();
}

////////////////

 private boolean isBrowserRunning(String processName)
        {
            ActivityManager manager = (ActivityManager) this.getSystemService(ACTIVITY_SERVICE);
            String packageName = manager.getRunningTasks(1).get(0).topActivity.getPackageName();
            Log.i("LogTest", "Current process package name: " + packageName);

            return processName.equalsIgnoreCase(packageName); 
        }

Opera mini や US browser など、他のブラウザパッケージ名を知るためにサンプルプロジェクトを作成することができます。

以下の権限をマニフェストに追加します。

<uses-permission 
        android:name="android.permission.GET_TASKS" />
于 2012-05-07T09:54:53.600 に答える
1

すべてのアクティビティでそれを管理したくないことはわかっていますが、これを実行しても、スーパー アクティビティを使用して 1 か所でコードを処理できます。

public abstract class BlundellActivity extends Activity {
     @Override
     public void onPause(){
         // Whatever strategy you want
     }
}

public class SomeActivity extends BlundellActivity {
     // Do whatever you normally want to do
}

public class SomeActivity extends BlundellActivity {
     // Do whatever you normally want to do here as well
}
于 2012-05-06T18:10:46.663 に答える
0

複数のソリューションを使用する代わりに、すべての問題を解決する単一のソリューションを使用できます。

この答えを確認してください:

https://stackoverflow.com/a/8576529/327011

アプリケーションの各アクティビティにBroadcastおよびBroadcastReceiversを使用すると、アプリケーションがバックグラウンドになるたびにすべてのアクティビティを強制終了できます。

更新

アプリケーションがいつバックグラウンドでonStopを使用できるかを検出するには、これをチェックして理論を理解します。アクティビティのサイドバイサイドライフサイクル

そしてこれは実装です:https ://stackoverflow.com/a/5862048/327011

必要なのはこれだけだと思います:-)

于 2012-05-09T13:59:56.320 に答える
0

バンドルを使用して、呼び出し元のアプリから適切なパラメーターを渡す必要があります (つまり、アプリ内の何かをクリックします (リンク付きの TextView))。

呼び出されたアプリ (メール アプリ) でパラメーターを取得します。

パラメータでアクティビティの名前を送信できます。

現在、メールアプリ(呼び出されたアプリ)にいる 戻るボタンをクリックして、呼び出し元のアプリケーションに戻ります。

オプションで、必要に応じて呼び出し元プログラムからアクティビティの状態を保存できます。

このロジックを実装するには、Bundle と Intent を使用する必要があります。

コードスニペット:

呼び出し元プログラムでは、呼び出し先プログラムの戻るボタン機能に必要なパラメーター/データを保存する必要があります。

Bundle bndleData = new Bundle(); Bundle クラスの putString()、putInt() メソッドを使用します。

    String prefix = getPackageName().toString();
           (this prefix can be stored in application level constants.java file as applicable)

    bndleData.putString("ParentActivity", this.getLocalClassName());

必要に応じて、追加のパラメーターも格納します。 bndleData.putString("paramName", valueofParamName); bndleData.putInt("IntChannelImage", chImageInt);

    Intent intent = new Intent(v.getContext(), AMRChannelPlayer.class);

    intent.putExtra(prefix + "bndleChnlData", bndleData);

    startActivity(intent);

呼び出し元プログラム: バンドルからデータ、アクティビティ nae を取得し、戻るボタンの実装で使用します。

プレフィックス = getPackageName().toString(); バンドル エクストラ = getIntent().getBundleExtra(prefix + "bndleData");

String parentActivity = extras.getString("ParentActivity"); extras.getString("paramName");

これがお役に立てば幸いです。

于 2012-05-10T15:03:35.850 に答える
0

this.finish()のを呼び出すことができますonPause()Activityこれにより、3 つのケースでアクティビティが終了します。

于 2012-05-04T15:39:56.590 に答える