2012-11-28 84 views
7

所以我有一個簡單的問題,如果此活動是從相同的服務(使用Intent)開始的,可以在服務中處理onActivityResult()方法?在服務上處理onActivityResult

在我的情況,我要開始SpeechRegnition,說話,並獲取有關服務的結果,背景(主要服務從開始一個Widget)的一切,

感謝。

+0

我沒有試過,我從來沒有試圖現在在非活動類中使用onAtcivityResult ... – user1839514

回答

6

感謝最近的下調,無論是誰。我之前在2012年給出的答案是非全部的,所以我決定寫一個適當的答案。

您無法處理服務中的活動結果,但可以將從onActivityResult()檢索到的任何數據傳遞給服務。

如果您的服務已在運行,你可以調用startService()有一個新的intent處理事件,像這樣

@Override 
public void onActivityResult(final int requestCode, final int resultCode, final Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    if (requestCode == CODE && resultCode == RESULT_OK) { 
     notifyService(data); 
    } 
} 

private void notifyService(final Intent data) { 
    final Intent intent = new Intent(this, MyService.class); 
    intent.setAction(MyService.ACTION_HANDLE_DATA); 
    intent.putExtra(MyService.EXTRA_DATA, data); 
    startService(intent); 
} 

而且在服務處理動作。如果它已在運行它不會被重新啓動,否則會啓動

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    if (intent != null) { 
     final String action = intent.getAction(); 
     if (action != null) { 
      switch (action) { 
       case ACTION_HANDLE_DATA: 
        handleData(intent.getParcelableExtra(EXTRA_DATA)); 
        // Implement your handleData method. Remember not to confuse Intents, or even better make your own Parcelable 
        break; 
      } 
     } 
    } 
    return START_NOT_STICKY; 
} 
+0

你不必展示它。它只需要實例化一次。 你的應用程序是由一些活動啓動的。在那裏覆蓋回調方法。對其進行靜態引用以從服務訪問,然後從服務中的該引用開始期望的活動,並且將在引用的活動中得到結果。在可以調用服務的靜態方法之後,或者發送廣播或其他任何內容以將結果傳遞給服務之後。 但是我不記得在演講活動結束或沒有完成之後是否會重新傳遞給一個活動。 –

+0

更新了答案。 –

+1

這是一個非常糟糕的做法。將活動存儲在靜態字段中會導致活動泄漏,除非您明確將其設置爲空。即使你很小心,仍然很難做到。有很多方法來處理這個 – dnkoutso

1

Service範圍內沒有OnActivityForResult這樣的東西。

您可以閱讀Android開發人員指南here

+1

好吧,這就是爲什麼我問我該怎麼做,thx。 – user1839514

0

最近,我在同樣的問題絆倒,如何把onActivityResult()的結果,爲的活動相關的服務從上述服務啓動。我不想將活動存儲在靜態變量中,因爲活動泄漏是一種不好的做法。因此,我在Activity處理onActivityResult()中添加了一個靜態偵聽器,該靜態偵聽器實現了一個適當的接口並將此偵聽器實例化爲Service類的私有成員。

的簡化形式的代碼如下所示:

public class MyActivity extends FragmentActivity { 

    public Interface ResultListener { 
     onPositiveResult(); 
     onNegativeResult(); 
    } 

    private static ResultListener mResultListener; 

    public static setListener(ResultListener resultListener) { 
     mResultListener = resultListener; 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     if (resultCode == Activity.RESULT_OK && mResultListener != null) { 
      mResultListener.onPositiveResult(); 
     } else if (resultCode == Activity.RESULT_CANCELED && mResultListener != null) { 
      mResultListener.onNegativeResult(); 
     } 
     mResultListener = null; 
    } 
} 

public class MyService { 

    private MyActivity.ResultListener mListener = new MyActivity.ResultListener() { 
     onPositiveResult() { 
      // do something on RESULT_OK 
     } 
     onNegativeResult() { 
      // do something on RESULT_CANCELED 
     } 
    } 

    private void startActivityForResultFromHere() { 
     MyActivity.setListener(mListener); 
     Intent intent = new Intent(); 
     intent.setClass(this, MyActivity.class); 
     intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     startActivity(intent); 
    } 
} 

正如你可以看到我不能避免由於設備旋轉問題靜態引用,但我認爲這個方案是比較合適的;儘管冗長。

0

打開服務中的透明活動並使用服務中的BroadcastReceiver。按照步驟詳細。在服務

BroadcastReceiver brOnActivityResult = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     // TODO: 
    } 
}; 
從服務

1. 打開透明活性

Intent i = new Intent(mContext, FloatingServiceSupportActivity.class); 
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
i.putExtra("action", "SpeechRegnition"); 
mContext.startActivity(i); 

//對於透明活性使用這個代碼在AndroidManifest.xml

<activity 
android:name=".FloatingServiceSupportActivity" 
android:theme="@style/Theme.Transparent" /> 

2. 創建廣播接收器

3. 中的onCreate註冊服務

IntentFilter brintent = new IntentFilter(); 
brintent.addAction("brActionFloatingServiceOnActivityResult"); 
mContext.registerReceiver(brOnActivityResult, brintent); 

4的這個廣播。 註銷此廣播中的onDestroy服務

mContext.unregisterReceiver(brOnActivityResult); 

5. 使用startActivityForResult不要在活動的工作和活動的(FloatingServiceSupportActivity)發送廣播onActivityResult

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

Intent i = new Intent(); 
i.setAction("brActionFloatingServiceOnActivityResult"); 
i.putExtra("action", "initTextToSpeech"); 
mActivity.sendBroadcast(i); 

mActivity.finish(); 
}