7

Android で REST クライアントを実装しています。Serviceを使用してサーバーへの接続を実行しResultReceiver、操作の完了を通知する例を見てきました。フラグメントからサービスを呼び出しています。サービスの実行中に画面を回転しようとすると、ResultReceiverおそらくそのフラグメントがレイアウトにないため、 getActivity() メソッドが null を返します。

フラグメントのコールバック メソッド:

@Override
public void onReceiveResult(int resultCode, Bundle resultData) {
    Response response = (Response) resultData
            .getSerializable(RestService.RESULT);
    if (resultCode == RestService.SUCCESS
            && response != null) {
        if (getActivity() != null) {
            recommendationResponse = response;
            getLoaderManager().restartLoader(0, new Bundle(),
                    Fragment.this);
        }

    }
}

getActivity()null を返します。これは正常ですか?画面の回転でも通知を許可するには、どのようなアプローチを使用できますか? ローカル放送?

4

5 に答える 5

1

私はBroadcastReceiver登録済みの使用を使用LocalBroadcastManagerしており、正常に動作しています。それほど単純ではありませんでした。より良い解決策はありますか?

于 2012-06-07T13:23:59.157 に答える
1

同じ問題に遭遇し、ResultReceiver の onReceivedResult メソッドで NULL を確認して解決したと思います。ここに投稿されたコードは、ワーカー フラグメント (UI のないフラグメントと onCreate の setRetainInstance(true)) で動作します。

protected void onReceiveResult(int resultCode, Bundle resultData) {
            //Verify activity
            if(getActivity() != null){
                //Handle result
            }else{
                notificationPending = true;                 
            }
        }

notificationPending フラグは、アクティビティが見つからなかった場合にフラグメントが保留中の通知を保持するのに役立ちます (アクティビティはフラグメントのデタッチでは使用できません)。

フラグメントがアクティビティに再接続すると、このロジックを実行します

public void onAttach(Activity activity){
    super.onAttach(activity);
        if(notificationPending){
            //Handle notification
            notificationPending = false;
        }
}

それが役に立てば幸い。必要に応じて、詳細を尋ねることができます。乾杯

于 2012-09-29T19:10:44.113 に答える
-1

getActivity() は null を返します。これは正常ですか?

Android アクティビティは、デバイスのローテーション後に再作成されます。

アクティビティが再作成された後、古いコンテキストは保持されません。そのため getActivity()、null として取得されます

画面の回転でも通知を許可するには、どのようなアプローチを使用できますか? ローカル放送?

画面の回転時にアクティビティを再作成したくない場合は、マニフェストの後に言及してください

        <activity
            android:name=".MyActivity"
            android:configChanges="orientation"    <<<<<<<<<
            android:label="@string/app_name"
            android:screenOrientation="portrait" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

最後に、Activity で以下をオーバーライドする必要があります。

@Override
    public void onConfigurationChanged(Configuration newConfig)
    {
        // TODO Auto-generated method stub
        super.onConfigurationChanged(newConfig);
    }
于 2012-06-07T07:54:23.520 に答える