Android सेवा से गतिविधि शुरू करें


151

एंड्रॉयड:

public class LocationService extends Service {

@Override
    public void onStart(Intent intent, int startId) {
        super.onStart(intent, startId);
        startActivity(new Intent(this, activity.class));
    }
}

मैंने इस सेवा का शुभारंभ किया Activity

में Activityअगर हालत संतुष्ट शुरू

startService(new Intent(WozzonActivity.this, LocationService.class));

मेरे LocationServiceउपर्युक्त से लॉन्च नहीं हो सकता है Activity, मैं Activityसेवा वर्ग में चालू चालू का संदर्भ कैसे प्राप्त कर सकता हूं ?

जवाबों:


344

सेवा वर्ग के अंदर से:

Intent dialogIntent = new Intent(this, MyActivity.class);
dialogIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(dialogIntent);

17
केवल FLAG_ACTIVITY_NEW_TASK की आवश्यकता है क्योंकि केवल गतिविधियाँ इसके बिना गतिविधियाँ शुरू कर सकती हैं। 'यह' getBaseContext और getApplication के स्थान पर उपयोग किया जा सकता है क्योंकि सेवा का अपना संदर्भ है।
सूज

1
प्रोग्राम को हाल की स्क्रीन सूची से कैसे निकालें?
प्रशान्त देवबदवार

2
सेवा पृष्ठभूमि पर है तो काम नहीं करता है। इसके लिए कोई फिक्स?
रिक रॉयड अबान

4
कृपया पृष्ठभूमि सेवा से मेरे द्वारा फायरबस (FCM) सेवा का उपयोग करने के खुले आवेदन के लिए मेरी मदद करें। मैं अपने ऐप से मेरी कॉलिंग यूआई स्क्रीन खोलना चाहता हूं, इसलिए कृपया इसके लिए मेरी मदद करें
दीपांकी जादव

2
ऐप के बैकग्राउंड में होने पर मैंने आपकी सेवा के अंदर अपना कोड लिख दिया है, और मैं देखता हूं कि इस सेवा ने xiaomi mi a2 पर काम किया है, लेकिन xiaomi redmi note 7 पर काम नहीं कर रहा है, क्या आप मेरी मदद कर सकते हैं कि यह एक डिवाइस पर काम क्यों नहीं कर रहा है?
अमजद ओमारी

18

मुझे भी यही समस्या थी, और मैं आपको बताना चाहता हूं कि उपरोक्त किसी ने भी मेरे लिए काम नहीं किया। मेरे लिए क्या काम था:

 Intent dialogIntent = new Intent(this, myActivity.class);
 dialogIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
 this.startActivity(dialogIntent);

और मेरे एक उपवर्ग में, मुझे एक अलग फ़ाइल में संग्रहीत किया गया था:

public static Service myService;

myService = this;

new SubService(myService);

Intent dialogIntent = new Intent(myService, myActivity.class);
dialogIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
myService.startActivity(dialogIntent);

अन्य सभी उत्तरों ने मुझे ए nullpointerexception


5
आप सेवा को एक स्थिर क्षेत्र में संग्रहीत कर रहे हैं, जिससे मेमोरी लीकेज हो सकती है
म्यूरेल

1
startActivity एक ही है। यह सक्रियता है! आप अपनी सेवा से एक बेकार उदाहरण के साथ समान सामान्य शुरुआत बना रहे हैं, क्यों?
अमीर होसैन घासेमी

8

एक और बात ध्यान देने योग्य है: जबकि ऊपर दिया गया उत्तर ठीक काम करता है जब हमारा कार्य पृष्ठभूमि में होता है, एक ही तरीका है कि मैं इसे काम कर सकता हूं यदि हमारा कार्य (कुछ गतिविधियों से बना) अग्रभूमि में था (यानी हमारी एक गतिविधि दिखाई दे रही थी) उपयोगकर्ता के लिए) इस तरह था:

    Intent intent = new Intent(storedActivity, MyActivity.class);
    intent.setAction(Intent.ACTION_VIEW);
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
    storedActivity.startActivity(intent);

मुझे नहीं पता कि ACTION_VIEW या FLAG_ACTIVITY_NEW_TASK यहां किसी वास्तविक उपयोग के हैं या नहीं। सफल होने की कुंजी थी

storedActivity.startActivity(intent);

और निश्चित रूप से फिर से गतिविधि को तुरंत नहीं करने के लिए FLAG_ACTIVITY_REORDER_TO_FRONT। शुभकामनाएँ!


1
यह काम नहीं करता। यह सब मुझे देता है "एक गतिविधि के संदर्भ के बाहर से कॉलिंग स्टार्टअक्टिविटी () को FLAG_ACTIVITY_NEW_TASK ध्वज की आवश्यकता है। क्या यह वास्तव में आप चाहते हैं?"
सेरिन

2
इसका कारण यह है कि सेटफ्लैग पर दूसरा कॉल पहले वाले को ओवरराइड करता है। इस समाधान में IntF.FLAG_ACTIVITY_NEW_TASK && Intent.FLAG_ACTIVITY_REORDER_TO_FRONT गुजरने वाले झंडे सेट करने के लिए addFlags या एकल कॉल का उपयोग करना चाहिए।
फर्गुस्मेक

8
आप झंडे को && से जोड़ना नहीं चाहते हैं; आप उपयोग करना चाहते हैं | (बिटवाइस या के लिए एक बार)
जॉन वाट ने

अभिप्राय अभिप्राय = नया अभिप्राय (संग्रहशीलता, MyActivity.class); intent.setAction (Intent.ACTION_VIEW); intent.addFlags (Intent.FLAG_ACTIVITY_NEW_TASK); intent.addFlags (Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); storedActivity.startActivity (आशय);
प्रखर 1001

1

एक का उपयोग नहीं कर सकते हैं Contextकी Service; (पैकेज) को Contextसमान रूप से प्राप्त करने में सक्षम था :

Intent intent = new Intent(getApplicationContext(), SomeActivity.class);

मुझे लगता है कि यह केवल FLAG_ACTIVITY_NEW_TASKध्वज के साथ काम करता है
सेर्लिन

0

वैकल्पिक रूप से,

आप अपनी स्वयं की एप्लिकेशन क्लास का उपयोग कर सकते हैं और जहां कहीं भी आपको ज़रूरत हो (विशेष रूप से गैर-गतिविधियाँ) से कॉल कर सकते हैं।

public class App extends Application {

    protected static Context context = null;

    @Override
    public void onCreate() {
        super.onCreate();
        context = getApplicationContext();
    }

    public static Context getContext() {
        return context;
    }

}

और अपना आवेदन वर्ग पंजीकृत करें:

<application android:name="yourpackage.App" ...

फिर कॉल करो :

App.getContext();

2
संदर्भ के एक स्थिर उदाहरण का उपयोग करने का ख्याल रखें, इससे
गंभीर

1
@ क्रैगरिडोस नोप। यह अनुप्रयोग का संदर्भ है जो कि इसकी प्रकृति से सिंगलटन है और यह मेमोरी लीक की ओर नहीं ले जाएगा
GV_FiQst

1
मैं लाइन बदल जाएगा context = getApplicationContext();करने के लिएcontext = this;
GV_FiQst

-1

यदि आपको अपनी सेवा से किसी ऐसी गतिविधि को फिर से शुरू करने की आवश्यकता है, जो मुझे बताई जा रही है, तो मैं निम्नलिखित लिंक का सुझाव देता हूं। Intent.FLAG_ACTIVITY_NEW_TASK समाधान नहीं है।

https://stackoverflow.com/a/8759867/1127429

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.