2012-11-28 12 views
7

तो मेरे पास एक साधारण प्रश्न है, यदि सेवा को उसी सेवा (इरादे का उपयोग करके) से शुरू किया गया था, तो एक सेवा में एक्टिविटी रिसैट() पर विधि को संभालना संभव है?एक सेवा पर एक्टिविटी रीसेट पर

मेरे मामले में, मुझे SpeechRegnition शुरू, बोलो, और सेवा पर परिणाम प्राप्त, पृष्ठभूमि (एक विजेट से मुख्य सेवा प्रारंभ) पर सब कुछ,

धन्यवाद करना चाहते हैं।

+0

मुझे कोई कोशिश की है और मैं कभी नहीं की कोशिश की है एक गैर-गतिविधि कक्षा में अभी भी एटीसीविटी रिसेट का उपयोग करें ... – user1839514

उत्तर

6

हाल ही में डाउनवॉटिंग के लिए धन्यवाद, जो भी हो। पिछले जवाब में मैंने 2012 में दिया था, कुल बकवास है इसलिए मैंने एक उचित लिखने का फैसला किया।

आप गतिविधि में गतिविधि परिणाम को संभाल नहीं सकते हैं, लेकिन आप एक्टिविटी रिसैट() से किसी सेवा को पुनर्प्राप्त कर सकते हैं।

यदि आपका सेवा पहले से ही चल रहा है, आप एक नया आशय घटना से निपटने के साथ startService() कहते हैं तो

@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

के दायरे में OnActivityForResult जैसी कोई चीज़ नहीं है।

आप एंड्रॉइड डेवलपर दिशानिर्देश here पढ़ सकते हैं।

+1

ठीक है, इसलिए मैंने पूछा कि मैं इसे कैसे कर सकता हूं, thx। – user1839514

0

मैं हाल ही में एक ही मुद्दा पर ठोकर खाई, onActivityResult तार करने के लिए कैसे() एक गतिविधि के लिए एक सेवा के लिए परिणाम ऊपर उल्लिखित सेवा से शुरू कर दिया। मैं एक स्थिर चर में गतिविधि को स्टोर नहीं करना चाहता था क्योंकि गतिविधि रिसाव एक बुरी प्रथा है। इसलिए मैंने एक्टिविटी रिसैट() पर गतिविधि हैंडलिंग में एक स्थिर श्रोता जोड़ा जो उचित इंटरफ़ेस लागू करता है और इस श्रोता को सेवा वर्ग के निजी सदस्य के रूप में तुरंत चालू करता है।

सरलीकृत रूप में कोड इस तरह दिखता है:

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); 
    } 
} 

आप देख सकते हैं मैं डिवाइस रोटेशन मुद्दों की वजह से स्थिर संदर्भ से बचने नहीं कर सकता है, लेकिन मुझे लगता है कि इस समाधान अधिक उपयुक्त है; यद्यपि verbose।

0

सेवा से ओपन पारदर्शी गतिविधि और सेवा में ब्रॉडकास्ट रिसीवर का उपयोग करें। विस्तार से चरणों का पालन करें।

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. सेवा में

BroadcastReceiver brOnActivityResult = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     // TODO: 
    } 
}; 
BroadcastReceiver बनाएं

3. इस प्रसारण को सेवा के निर्माण पर पंजीकृत करें

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(); 
} 
संबंधित मुद्दे