एक गतिविधि के बाहर से कॉलिंग स्टार्ट एक्टिविटी ()?


196

मैं AlarmManagerएक आशय को ट्रिगर करने के लिए उपयोग कर रहा हूं जो एक संकेत प्रसारित करता है। निम्नलिखित मेरा कोड है:

AlarmManager mgr = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
Intent i = new Intent(this, Wakeup.class);
try
{
    PendingIntent pi = PendingIntent.getBroadcast(this, 0, i, 0);
    Long elapsed +=  // sleep time;
    mgr.set(AlarmManager.RTC_WAKEUP, elapsed, pi);
}
catch(Exception r)
{
    Log.v(TAG, "RunTimeException: " + r);
}

मैं इस कोड को कॉल कर रहा हूं Activity, इसलिए मुझे नहीं पता कि मुझे निम्नलिखित त्रुटि कैसे हो सकती है ...

ERROR/AndroidRuntime(7557): java.lang.RuntimeException: Unable to start receiver com.wcc.Wakeup: android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity  context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?

जवाबों:


494

यदि आपका Android संस्करण Android - 6 से नीचे है, तो आपको इस पंक्ति को जोड़ने की आवश्यकता है अन्यथा यह Android - 6 से ऊपर काम करेगा।

...
Intent i = new Intent(this, Wakeup.class);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
...

8
हाँ, यह काम करता है। लेकिन अगर आप एक ही गतिविधि के कई उदाहरण शुरू करना चाहते हैं तो यह काम नहीं करता है। चूंकि
FLAG_ACTIVITY_NEW_TASK

7
अपनी समस्या का समाधान करने के लिए झंडा FLAG_ACTIVITY_Multiple_TASKS जोड़ें
पवनकुमार विजापुर

खबरदार, आपको Android 9+ पर भी इसकी आवश्यकता है, स्पष्टीकरण के लिए यह उत्तर देखें
वादिम कोटोव

55

एक ही गतिविधि के कई उदाहरणों के लिए, निम्नलिखित स्निपेट का उपयोग करें,

नोट : यह स्निपेट, मैं अपने से बाहर का उपयोग कर रहा हूं Activity। सुनिश्चित करें कि आपकी AndroidManifestफ़ाइल में शामिल नहीं है android:launchMode="singleTop|singleInstance"। यदि आवश्यक हो, तो आप इसे बदल सकते हैं android:launchMode="standard"

Intent i = new Intent().setClass(mActivity.getApplication(), TestUserProfileScreenActivity.class);  
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_MULTIPLE_TASK);

// Launch the new activity and add the additional flags to the intent
mActivity.getApplication().startActivity(i);

यह मेरे लिए ठीक काम करता है। आशा है, यह किसी के लिए समय बचाता है। अगर किसी को बेहतर तरीका मिल जाए, तो कृपया हमारे साथ साझा करें।


5
कृपया setFlags () और addFlag () विधियों के बीच अंतर को समझें। अब आप जो कुछ भी कर रहे हैं वह FLAG_ACTIVITY_NEW_TASK के साथ एक गतिविधि शुरू कर रहा है। जैसा कि नीचे क्रिस्टियन द्वारा पोस्ट किए गए कोड में है।
JehandadK

-------------------------------------------------- ----------------- i.addFlag (Intent.FLAG_ACTIVITY_MULTIPLE_TASK); i.addFlag (Intent.FLAG_ACTIVITY_NEW_TASK); -------------------------------------------------- ----------------- i.setFlags (Intent.FLAG_ACTIVITY_NEW_TASK; Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
JehandadK

42

Android Doc का कहना है -

FLAG_ACTIVITY_NEW_TASK आवश्यकता अब लागू की गई है

एंड्रॉइड 9 के साथ, आप एक गैर-गतिविधि संदर्भ से गतिविधि शुरू नहीं कर सकते हैं जब तक कि आप आशय का झंडा FLAG_ACTIVITY_NEW_TASK पास न करें। यदि आप इस झंडे को पास किए बिना किसी गतिविधि को शुरू करने का प्रयास करते हैं, तो गतिविधि शुरू नहीं होती है, और सिस्टम लॉग को संदेश प्रिंट करता है।

नोट: ध्वज की आवश्यकता हमेशा अभिप्रेत व्यवहार की रही है, और इसे एंड्रॉइड 7.0 (एपीआई स्तर 24) की तुलना में कम संस्करणों पर लागू किया गया था। एंड्रॉइड 7.0 में एक बग ने ध्वज की आवश्यकता को लागू होने से रोक दिया।

इसका अर्थ है कि संदर्भ के बाहर से कॉल करते समय (Build.VERSION.SDK_INT <= Build.VERSION_CODES.M) || (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P)इसे जोड़ना अनिवार्य है ।Intent.FLAG_ACTIVITY_NEW_TASKstartActivity()Activity

इसलिए सभी संस्करणों के लिए ध्वज जोड़ना बेहतर है -

...
Intent i = new Intent(this, Wakeup.class);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
...

12

आप जिस हिस्से को कॉल करते हैं startActivity, उस हिस्से को पेस्ट नहीं करते हैं , यह दिलचस्प हिस्सा है।

आप startActivityएक Serviceसंदर्भ में, या एक संदर्भ में कॉल कर सकते हैं Application

startActivityकॉल करने से पहले बिल्ली को लॉग करने के लिए "यह" प्रिंट करें, और देखें कि यह क्या संदर्भित करता है, यह कभी-कभी एक आंतरिक "इस" गलती से उपयोग करने का मामला है।


1
यह संभावना है कि ओपी को समस्या हो रही है। मैंने उसी का सामना किया है। मौजूदा गतिविधि के बजाय getApplicationContext () के साथ एक गतिविधि लॉन्च करना इस त्रुटि को ट्रिगर करेगा।
हजेन हिल्स सॉफ्टवेयर

नीस :) मुझे पूरा यकीन है कि यह गलती थी जो मैं पूरी शाम को देखने की कोशिश करता हूं। धन्यवाद, मिस्टर।
मार्टिन Pffffer

9

कभी-कभी यह त्रुटि स्पष्ट कॉल के बिना हो सकती है startActivity(...)। उदाहरण के लिए, आप में से कुछ ने क्रैशलाईटिक्स में इस तरह का स्टैक ट्रेस देखा होगा:

Fatal Exception: android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity  context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?
       at android.app.ContextImpl.startActivity(ContextImpl.java:1597)
       at android.app.ContextImpl.startActivity(ContextImpl.java:1584)
       at android.content.ContextWrapper.startActivity(ContextWrapper.java:337)
       at android.text.style.URLSpan.onClick(URLSpan.java:62)
       at android.text.method.LinkMovementMethod.onTouchEvent(LinkMovementMethod.java:217)
       at android.widget.TextView.onTouchEvent(TextView.java:9522)
       at android.view.View.dispatchTouchEvent(View.java:8968)
       at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2709)
       at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2425)
       at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2709)
       at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2425)
       at android.widget.AbsListView.dispatchTouchEvent(AbsListView.java:5303)
       at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2709)
       at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2425)
       at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2709)
       at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2425)
       at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2709)
       at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2425)
       at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2709)
       at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2425)
       at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2709)
       at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2425)
       at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2709)
       at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2425)
       at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2709)
       at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2425)
       at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2709)
       at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2425)
       at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2709)
       at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2425)
       at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2709)
       at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2425)
       at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2709)
       at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2425)
       at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2559)
       at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1767)
       at android.app.Activity.dispatchTouchEvent(Activity.java:2866)
       at android.support.v7.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:67)
       at android.support.v7.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:67)
       at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2520)
       at android.view.View.dispatchPointerEvent(View.java:9173)
       at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:4706)
       at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4544)
       at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4068)
       at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4121)
       at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4087)
       at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:4201)
       at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4095)
       at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:4258)
       at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4068)
       at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4121)
       at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4087)
       at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4095)
       at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4068)
       at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:6564)
       at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:6454)
       at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:6425)
       at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:6654)
       at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185)
       at android.os.MessageQueue.nativePollOnce(MessageQueue.java)
       at android.os.MessageQueue.next(MessageQueue.java:143)
       at android.os.Looper.loop(Looper.java:130)
       at android.app.ActivityThread.main(ActivityThread.java:5942)
       at java.lang.reflect.Method.invoke(Method.java)
       at java.lang.reflect.Method.invoke(Method.java:372)
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1400)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1195)

और आपको आश्चर्य हो सकता है कि आपने क्या गलत किया, क्योंकि ट्रेस में केवल फ्रेमवर्क कोड शामिल है। खैर, यहां एक उदाहरण है कि यह कैसे हो सकता है। मान लीजिए कि हम एक टुकड़े में हैं।

Activity activity = getActivity();
Context activityContext = activity;
Context appContext = activityContext.getApplicationContext();
LayoutInflater inflater = LayoutInflater.from(appContext); // whoops!
View view = inflater.inflate(R.layout.some_layout, parent, false);
TextView tvWithLinks = (TextView) view.findViewById(R.id.tv_with_links);

tvWithLinks.setMovementMethod(LinkMovementMethod.getInstance()); // whoops!!

अब, जब कोई उपयोगकर्ता उस टेक्स्ट दृश्य पर क्लिक करता है, तो आपका ऐप ऊपर दिए गए स्टैक ट्रेस के साथ क्रैश हो जाएगा। इसका कारण यह है कि लेआउट इनफ़्लोटर में एप्लिकेशन संदर्भ का संदर्भ होता है , और इसलिए आपके टेक्स्ट दृश्य में एप्लिकेशन संदर्भ होता है। उस पाठ दृश्य पर क्लिक करने से अंतर्निहित कॉल दिखाई देती है appContext.startActivity(...)

अंतिम नोट: मैंने इसे एंड्रॉइड 4, 5, 6 और 7 उपकरणों पर परीक्षण किया है। यह केवल 4, 5, और 6. को प्रभावित करता है। Android 7 उपकरणों को स्पष्ट रूप से कॉल करने में कोई परेशानी नहीं है appContext.startActivity(...)

मैं उम्मीद करता हूं कि इससे किसी की मदद होगी!


2

यही त्रुटि मुझे नवीनतम एंड्रॉइड डिवाइस 9 और 10 में अधिसूचना प्राप्त करने के मामले में सामना करना पड़ा है।

यह लॉन्च मोड पर निर्भर करता है कि आप इसे कैसे संभाल रहे हैं। नीचे दिए गए कोड का उपयोग करें: - android: launchMode = "singleTask"

इस ध्वज को आशय के साथ जोड़ें: - आशय ।setFlags (Intent.FLAG_ACTIVITY_NEW_TASK);



1

मैं बस यह नोटिस करना चाहता हूं कि startActivityबाहर से एक गतिविधि कुछ एंड्रॉइड संस्करणों (एन और ओ-एमआर 1 के बीच) में मान्य है और दिलचस्प बात यह है कि यह एंड्रॉइड स्रोत कोड में एक बग है!


यह startActivityकार्यान्वयन से ऊपर की टिप्पणी है । देखें यहाँ

FLAG_ACTIVITY_NEW_TASK के बिना किसी गतिविधि के बाहर से गतिविधि शुरू करना आम तौर पर अनुमति नहीं है, सिवाय इसके कि कॉलर निर्दिष्ट करता है कि कार्य आईडी को गतिविधि को लॉन्च किया जाना चाहिए। N और O-MR1 के बीच एक बग मौजूद था जिसने इसे काम करने की अनुमति दी थी


उस के लिए क्या समाधान है
dominic_torreto

0

जब आप अपने ऐप के भीतर किसी गतिविधि को खोलना चाहते हैं तो आप पैरामीटर के रूप में एक इंटेंट के साथ startActivity () विधि को कॉल कर सकते हैं। वह इरादा वह गतिविधि होगी जिसे आप खोलना चाहते हैं। पहले आपको उस पैरामीटर का एक उद्देश्य बनाना होगा जिसमें पहला पैरामीटर संदर्भ और दूसरा पैरामीटर लक्षित गतिविधि वर्ग होना चाहिए।

Intent intent = new Intent(this, Activity_a.class);
startActivity(intent);

आशा है कि यह मदद करेगा।


3
मैं एक समीक्षक के रूप में लिख रहा हूं क्योंकि आपके उत्तर को निम्न-गुणवत्ता के लिए चिह्नित किया गया है। इस उत्तर की कमी यह है कि आपका कोड क्या करता है या यह सवाल में उत्पन्न समस्या का हल क्यों करता है, इसकी कोई व्याख्या नहीं है। क्या आप कृपया कुछ व्याख्यात्मक टिप्पणियां जोड़ सकते हैं, जो इस बात को ध्यान में रखते हुए कि भविष्य में मार्गदर्शन के लिए कई प्रोग्रामर आपके उत्तर को पढ़ सकते हैं। धन्यवाद!
बिल बेल

जब आप अपने ऐप के भीतर एक गतिविधि खोलने के लिए wnat करते हैं तो आप पैरामीटर के रूप में एक इंटेंट के साथ startActivity () विधि को कॉल कर सकते हैं। वह इरादा वह गतिविधि होगी जिसे आप खोलना चाहते हैं। पहले आपको उस पैरामीटर का एक उद्देश्य बनाना होगा जिसमें पहला पैरामीटर संदर्भ और दूसरा पैरामीटर लक्षित गतिविधि वर्ग होना चाहिए। आशा है कि यह मदद करेगा।
शादिकुर रहमान

ठीक है। लेकिन उस जानकारी को एक टिप्पणी में डालने के बजाय आपको अपने उत्तर को संपादित करना चाहिए और वहां डाल देना चाहिए। मुझे इस बात पर अफसोस है, लेकिन हर जवाब के लिए ऐसा करना जरूरी है। सादर।
बिल बेल

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