কোনও ক্রিয়াকলাপের বাইরে থেকে কলকে স্টার্টএটিভিটি () বলা হচ্ছে?


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

যদি আপনার অ্যান্ড্রয়েড সংস্করণ অ্যান্ড্রয়েড - 6 এর নীচে থাকে তবে আপনার এই লাইনটি যুক্ত করতে হবে অন্যথায় এটি অ্যান্ড্রয়েড - 6 এর উপরে কাজ করবে।

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

8
হ্যাঁ এই কাজ করে। তবে আপনি যদি একই ক্রিয়াকলাপের একাধিক উদাহরণ শুরু করতে চান তবে এটি কার্যকর হয় না। যেহেতু FLAG_ACTIVITY_NEW_TASK একই বিদ্যমান ক্রিয়াকলাপটি পুনরায় শুরু করবে
ওভিডিউ লাতকু

7
আপনার সমস্যার সমাধান করতে FLAG_ACTIVITY_ একাধিক_টাস্ক পতাকা যুক্ত করুন
বিজাপুর

সাবধান, আপনার এন্ড্রয়েড 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
দয়া করে সেটফ্ল্যাগ () এবং অ্যাডফ্ল্যাগ () পদ্ধতির মধ্যে পার্থক্যটি বুঝতে পারেন। আপনি এখন যা করছেন তা FLAG_ACTIVITY_NEW_TASK এর সাথে একটি ক্রিয়াকলাপ শুরু করছে। নীচে ক্রিশ্চিয়ানের পোস্ট কোড হিসাবে।
জেহান্দকে

-------------------------------------------------- ----------------- i.addFlag (Intent.FLAG_ACTIVITY_MULTIPLE_TASK); i.addFlag (Intent.FLAG_ACTIVITY_NEW_TASK); -------------------------------------------------- ----------------- i.setFlags (ইনটেন্ট.এফএলএজি_এসিটিভিটি_নিউউওয়াস্টাস | ইনটেন্ট.এফএলএজি_এসিটিভিটি_মুলটিপ্লে_টাস্ক);
জেহান্দকে

42

অ্যান্ড্রয়েড ডক বলেছেন -

FLAG_ACTIVITY_NEW_TASK প্রয়োজনীয়তা এখন প্রয়োগ করা হয়েছে

অ্যান্ড্রয়েড 9 এর সাহায্যে আপনি FLAG_ACTIVITY_NEW_TASK অভিপ্রায় পতাকা পাস না করে আপনি অ-কার্যকলাপের প্রেক্ষাপট থেকে কোনও ক্রিয়াকলাপ শুরু করতে পারবেন না। আপনি যদি এই পতাকাটি পাস না করে কোনও ক্রিয়াকলাপ শুরু করার চেষ্টা করেন তবে ক্রিয়াকলাপটি শুরু হয় না এবং লগটিতে সিস্টেম একটি বার্তা প্রিন্ট করে।

দ্রষ্টব্য: পতাকাটির প্রয়োজনীয়তা সর্বদা উদ্দেশ্যমূলক আচরণ ছিল এবং এটি Android 7.0 (API স্তর 24) এর চেয়ে কম সংস্করণে প্রয়োগ করা হয়েছিল। অ্যান্ড্রয়েড .0.০ এ থাকা একটি ত্রুটি পতাকাটির প্রয়োজনীয়তা প্রয়োগে বাধা দেয়।

এর অর্থ (Build.VERSION.SDK_INT <= Build.VERSION_CODES.M) || (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P)এটি কোনও প্রসঙ্গে বাইরে থেকে Intent.FLAG_ACTIVITY_NEW_TASKফোন করার সময় যুক্ত করা বাধ্যতামূলক ।startActivity()Activity

সুতরাং সমস্ত সংস্করণের জন্য পতাকা যুক্ত করা ভাল -

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

12

আপনি যে অংশটি কল করেছেন সেখানে আপনি আটকান নি startActivity, এটি মজাদার অংশ।

আপনি হয়ত startActivityকোনও Serviceপ্রসঙ্গে বা কোনও Applicationপ্রসঙ্গে কল করছেন।

startActivityকল করার আগে বিড়ালটিকে লগ করার জন্য "এটি" মুদ্রণ করুন এবং দেখুন এটি কী বোঝায় এটি কখনও কখনও দুর্ঘটনাক্রমে কোনও "অভ্যন্তরীণ" ব্যবহার করার ঘটনা।


1
এটি সম্ভবত ওপি-র সমস্যা। আমিও এর মুখোমুখি হয়েছি। বিদ্যমান ক্রিয়াকলাপের পরিবর্তে getApplicationContext () দিয়ে একটি কার্যকলাপ চালু করা এই ত্রুটিটিকে ট্রিগার করবে trigger
হাজেন হিলস সফটওয়্যার

নিস :) আমি পুরোপুরি নিশ্চিত যে এই পুরো ভুলটি আমি পুরো সন্ধ্যায় চিহ্নিত করার চেষ্টা করেছি। ধন্যবাদ, মিস্টার
মার্টিন ফেফার

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

সর্বশেষতম Android ডিভাইস 9 এবং 10 এ বিজ্ঞপ্তি পাওয়ার ক্ষেত্রে আমি এই একই ত্রুটির মুখোমুখি হয়েছি।

আপনি কীভাবে এটি পরিচালনা করছেন তা লঞ্চ মোডের উপর নির্ভর করে। কোডের নীচে ব্যবহার করুন: - অ্যান্ড্রয়েড: লঞ্চমোড = "একক টাস্ক"

এই পতাকাটি ইন্টেন্ট সহ যুক্ত করুন: - ইন্টেন্ট.সেটফ্লেগস (ইনটেন্ট.এফএলজি_এসিটিভিটি_এনইউভিটিএএসকে);



1

আমি কেবল লক্ষ্য করতে চাই যে startActivityবাইরে থেকে কোনও ক্রিয়াকলাপ কিছু অ্যান্ড্রয়েড সংস্করণগুলিতে বৈধ হয় (এন এবং ও-এমআর 1 এর মধ্যে) এবং আকর্ষণীয় বিষয়টি এটি অ্যান্ড্রয়েড উত্স কোডের একটি বাগ!


এটি startActivityবাস্তবায়ন উপরের মন্তব্য । এখানে দেখুন ।

FLAG_ACTIVITY_NEW_TASK ছাড়া একটি কার্যকলাপ বাইরে থেকে শুরু কার্যকলাপ কলিং সাধারণত অনুমোদিত নয় ব্যতীত যদি আহ্বানকারী নির্দিষ্ট করে কার্যকলাপে। চালু করা উচিত টাস্ক আইডি একটি বাগের উত্তর এবং ও-MR1 যা কাজ করার জন্য এই অনুমতি দেওয়া মধ্যে অস্তিত্ব ছিল


এর সমাধান কী
ডেমোমিক_টোরেটো

0

আপনি যখন নিজের অ্যাপের মধ্যে কোনও ক্রিয়াকলাপ খুলতে চান তখন আপনি পরামিতি হিসাবে একটি উদ্দেশ্য সহ স্টার্টঅ্যাক্টিভিটি () পদ্ধতিটি কল করতে পারেন। এই অভিপ্রায়টি আপনি যে ক্রিয়াকলাপটি খুলতে চান তা হবে। প্রথমে আপনাকে প্রসঙ্গ হতে প্রথম পরামিতি সহ লক্ষ্যটির ক্রিয়াকলাপের শ্রেণি হতে দ্বিতীয় পরামিতি সহ সেই অভিপ্রায়টির একটি অবজেক্ট তৈরি করতে হবে।

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

আশা করি এটি সাহায্য করবে।


3
আমি একটি পর্যালোচক হিসাবে লিখছি কারণ আপনার উত্তরটি নিম্নমানের জন্য চিহ্নিত করা হয়েছে। এই উত্তরটির অপ্রতুলতা হ'ল আপনার কোডটি কী করে বা এটি কেন প্রশ্নে উত্থিত সমস্যা সমাধান করে তার কোনও ব্যাখ্যা নেই। অনেক প্রোগ্রামার ভবিষ্যতে আপনার উত্তরটি গাইডেন্সের জন্য পড়তে পারে তা মনে রেখে আপনি কি কিছু ব্যাখ্যামূলক মন্তব্য যুক্ত করতে পারেন? ধন্যবাদ!
বিল বেল

আপনি যখন আপনার অ্যাপ্লিকেশনের মধ্যে কোনও ক্রিয়াকলাপ খুলতে চান না তখন আপনি পরামিতি হিসাবে একটি উদ্দেশ্য সহ স্টার্টঅ্যাক্টিভিটি () পদ্ধতিটি কল করতে পারেন। এই অভিপ্রায়টি আপনি যে ক্রিয়াকলাপটি খুলতে চান তা হবে। প্রথমে আপনাকে প্রসঙ্গ হতে প্রথম পরামিতি সহ লক্ষ্যটির ক্রিয়াকলাপের শ্রেণি হতে দ্বিতীয় পরামিতি সহ সেই অভিপ্রায়টির একটি অবজেক্ট তৈরি করতে হবে। আশা করি এটি সাহায্য করবে।
মোঃ শফিকুর রহমান

ঠিক আছে. তবে সেই তথ্যটি কোনও মন্তব্যে রাখার পরিবর্তে আপনার নিজের উত্তরটি সম্পাদনা করা উচিত এবং এটি সেখানে রাখা উচিত। আমি এই বিন্দুটি belaouring আফসোস কিন্তু প্রতিটি উত্তরের জন্য এটি করা গুরুত্বপূর্ণ। শুভেচ্ছান্তে.
বিল বেল

হ্যাঁ, দয়া করে আপনার উত্তর কেন সঠিক তা সম্পর্কে ব্যাখ্যা অন্তর্ভুক্ত করুন। আমরা কেবল যখন আমরা করণীয় করি তা শিখি তবেই আমরা আরও ভাল প্রোগ্রামার হতে শিখি।
কিউইকম্ব 123
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.