1

私のアプリケーションは非常に単純で、いくつかのアクティビティがあります(LoginActivityランチャーとメインアクティビティです)。それから私は他のいくつかの活動をし、最後にRouteActivityサービスを開始する活動をします。

は、通知付きでLocationService拡張Serviceします。startForegroundサービスは、LocationListenerすべての新しいGPSロケーションポイントを開始して登録するだけです。サービスは正常に機能しているように見えます。通知アイコンをタッチすると、(ログインアクティビティからではなく)開始した場所からアプリケーションアクティビティに戻ります。

ここで問題が発生します。(Androidランチャーの)アプリケーションアイコンをタッチすると、アプリが右側に表示され、現在のアクティビティRouteActivityが表示されることがありますが、約1時間後、アプリケーションアイコンをタッチすると、アプリケーションを最初から再起動するだけです。を開始しLoginActivityます。

しかし、サービス通知に触れると、適切なバックグラウンドアクティビティに戻ることができます。また、私のサービスは強制終了されないため、正常に機能しているように見えます。アプリケーションに関連付けられているオブジェクトと変数はまだ存在しています。

だから何 ?アプリケーションのインスタンスを2つ実行していますか?私はこれにちょっと迷っています、特にそれは時間に関連しているようです。

この「バグ」はAndroid2.Xで発生しますが、Android4.Xでは再現できません。アプリケーションを約1時間実行する必要があるため、デバッグは少し難しいです。その後、logcatに特別なメッセージはありません。

私は何かに気づきました:ActivityManagerメッセージは非常に奇妙です。通知センターのサービス通知を介してアプリケーションを起動すると、ログに記録されます。

Starting activity: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x14000000 cmp=com.wayzup.wayzupapp/com.wayzup.activity.RouteActivity bnds=[0,149][320,213]

アプリケーションアイコンを介して起動するとログに記録されますが、表示される実際のアクティビティはログインアクティビティではなく、実際にサービスを起動した実際のRouteActivityです。(約1時間後、効果的にLoginActivity開始されます)。

 Starting activity: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.wayzup.wayzupapp/com.wayzup.activity.LoginActivity bnds=[3,338][77,417] 

RouteActivityを起動するたびに、このログもあります

Activity idle timeout for HistoryRecord{44e78808 com.wayzup.wayzupapp/com.wayzup.activity.RouteActivity}

これは私の他の質問に関連しています:Androidフォアグラウンドサービスはコンテキストを失います しかし、これは本当の問題であり、より正確だと思います。

必要に応じて、コードを投稿できます。

4

2 に答える 2

1

すべての状態を維持するためにアクティビティタスクスタックに依存しているようです。代わりに、 PreferenceManager.getDefaultSharedPreferences()のようなものを使用して、ログイン/ログアウト状態を維持することをお勧めします。そうすれば、その活動が終了して再作成された場合でも生き残ることができます。

私が行う傾向があるのは、ユーザーがログインしたときにユーザーに表示してほしいアクティビティをメインアクティビティにすることです。onCreate()ユーザーがログインしているかどうかを確認し、ログインしていない場合は、startActivityForResult()ログインに送信します。アクティビティ。ログイン状態をどこかに永続化して、メインアクティビティので確認できるようにしますonCreate()

于 2012-09-26T17:44:17.353 に答える
0

私はついに問題を解決しました。これで、サービスが有効である限り、アクティビティが強制終了されたかどうかは関係ありません。私の中で、私のサービスが実行されているかどうかを確認し、実行されている場合は、それにバインドされてLoginActivityいるサービスを開始します。Si私は常にそれの単一の同じインスタンスを持っています。RouteActivitysingleTop

@Override
public void onResume(){
        super.onResume();
        if (checkMyServiceRunningOrNot()){
            restoreAcitivty();
        }
    }

public void restoreAcitivty(){
        Intent intent = new Intent(this, RouteActivity.class); 
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
        startActivity(intent); 
    }
于 2012-09-28T14:52:34.113 に答える