অ্যান্ড্রয়েড - স্টার্টঅ্যাক্টিভিটিফরালসুল্ট তত্ক্ষণাত ক্রিয়াকলাপের ফলাফলগুলিতে ট্রিগার করে


144

আমি কলটি ব্যবহার করে আমার অ্যাপ্লিকেশনটিতে মূল ক্রিয়াকলাপ থেকে কার্যক্রম শুরু করছি startActivityForResult(intent, ACTIVITY_TYPE)এবং সেগুলি কেবল একটিতে কাজ করছে।

এইটিকে বলা হয়, পছন্দসই হিসাবে ক্রিয়াকলাপটি চালু করে, কিন্তু লগতে আমি দেখতে পাচ্ছি যে onActivityResult()তাৎক্ষণিকভাবে ট্রিগার করা হচ্ছে। ক্রিয়াকলাপটি প্রদর্শিত হয় তবে RESULT_CANCELEDতাৎক্ষণিকভাবে ফিরে আসে onActivityResult()

আমি তখন ক্রিয়াকলাপের সাথে যোগাযোগ করি, একটি বোতাম টিপুন যা কল করে finish()এবং onActivityResult()এইবার ডাকা হয় না (কারণ সম্ভবত ফলস্বরূপ ফলাফল ইতিমধ্যে ফিরে এসেছে)।

আমরা যে কেউকে জানার জন্য? এর আগে কেউ এই আচরণ দেখেছেন?

উত্তর:


315

startActivityForResult()আপনার ক্রিয়াকলাপটি singleInstanceবা হিসাবে হিসাবে চালু করা হলে আপনি ব্যবহার করতে পারবেন না singleTaskstandardবা singleTopলঞ্চ মোড সমস্যার সমাধান করবে।


2
আপনার উভয়কে ধন্যবাদ, আমি আমার প্রকাশিত ফাইলটিতে এটি
পেয়েছিলাম

9
কি দারুন! এটি জাভাদোকগুলিতে যুক্ত করার মতো একটি স্পষ্ট জিনিস বলে মনে হচ্ছে! এটি পুরোপুরি সক্রিয় করার চেষ্টা করার জন্য আমি একটি পুরো সন্ধ্যা নষ্ট করে দিয়েছিলাম এবং এই উত্তরের উত্তরটি আমাকে স্মরণ করিয়ে দিয়েছে যে আমার ক্রিয়াকলাপটি একক শীর্ষে সেট করা আছে।
15-29

20
singleTopআমার পক্ষে ঠিক আছে বলে মনে হচ্ছে, singleTaskতবে এই সমস্যাটি সৃষ্টি করছিল এবং তাই singleInstanceঅবশ্যই এটি করবে
ডার্নমসন

4
এটিকে ডিবাগ করার জন্যও আমি দীর্ঘ সময় ব্যয় করেছি! ধন্যবাদ !!
suomi35

4
আমার ক্ষেত্রে, কোনও একক শ্রেণীকে একটি একক ইনস্টলস বা সিঙ্গলটপ হিসাবে সংজ্ঞায়িত করা হয়নি, তবে এখনও এটি ঘটছে ... কোনও পরামর্শ?
CoDe

110

অতিরিক্ত তা নিশ্চিত করুন যে উদ্দেশ্যটির Intent.FLAG_ACTIVITY_NEW_TASKসেট নেই।

ডক্স থেকে :

কলারটি চালু হওয়া ক্রিয়াকলাপ থেকে ফলাফলের জন্য অনুরোধ করলে এই পতাকা ব্যবহার করা যাবে না।


3
এটি আমার ক্ষেত্রে সমস্যাটি স্থির করেছে। সিঙ্গলআইনস্ট্যান্স, সিঙ্গলটপ বা সিঙ্গেল টাস্কের কারণে সমস্যা হয়নি।
ডায়ানা

আপনি একটি পুদিনা (একটি জীবন রক্ষাকারী)। এটি তখনই আমার আসল সমস্যা ছিল যখন আমি ব্যবহারকারী কোনও
খণ্ডে

@ ডায়ানা, আপনি কি তার পরিবর্তে কী ব্যবহার করেছেন তা মনে আছে Intent.FLAG_ACTIVITY_NEW_TASK?
কেসেলমে

@ কেসেলমে দুঃখিত, এটি অনেক দিন হয়ে গেছে, আমি আশা করি আমি সাহায্য করতে পারতাম তবে আমার মনে নেই এবং আমি সেই কোডটি আর অ্যাক্সেস করতে পারি না।
ডায়ানা

হ্যাঁ, এটি স্থির করুন। স্টার্টঅ্যাক্টিভিটিফেরাল
রেজাল্ট

21

আমি এই আচরণটি আগে দেখেছি, দয়া করে নিশ্চিত করুন যে আপনার গন্তব্য কার্যকলাপ (সেই বিশেষ ক্রিয়াকলাপ) singleInstanceঅ্যান্ড্রয়েডমেনিস্ট ফাইলটিতে নেই। ক্রিয়াকলাপটি যদি হয় singleInstanceতবে এটি RESULT_CANCELEDচালু হওয়ার আগেই ফিরে আসবে !


18

আমি এটি যুক্ত করতে চাই যে আপনি এটির সাথে একটি বাহ্যিক অ্যাপ্লিকেশন কল করতে পারেন:
Intent in = caller.getPackageManager().getLaunchIntentForPackage("com.your.package.here");
যা Intent.FLAG_ACTIVITY_NEW_TASKডিফল্টরূপে যুক্ত হয়ে একটি উদ্দেশ্য তৈরি করবে , তাই কল করুন:
in.setFlags(0);
যা পতাকাটি সাফ করবে এবং তারপরে আপনি এগিয়ে যেতে পারেন:startActivityForResult(in, action);

আমি এটি করার কারণটি হ'ল আমার কাছে একটি ইউটিলিটি অ্যাপ্লিকেশন রয়েছে যা কয়েকটি অন্যান্য অ্যাপ্লিকেশনগুলির মধ্যে সাধারণ কার্যকারিতা রয়েছে এবং আমি একাধিক আপডেটের বিষয়ে চিন্তা না করে কোড পরিবর্তন করে এক জায়গায় রাখতে পারি।


আমি জানি এটি পুরানো, তবে এটি আমার পক্ষে একেবারেই অমূল্য ছিল যে আমি ব্যবহারকারীর প্রতি ধন্যবাদ জানাতে চাই এবং যে কারও পক্ষে ক্রিয়াকলাপের মধ্যে ঝাঁপিয়ে পড়ে যে এটি সোনার উদ্রেক করছে! হ্যাকাথনের সময় আমার পাছা সংরক্ষণ করা হয়েছে;)
ওয়েস উইন

এটি আরও মনোযোগ প্রয়োজন। এটি সেরা সমাধান এবং আমার জন্য নিখুঁতভাবে কাজ করে। আপনি আমাকে অনেক সময় বাঁচিয়েছেন, আপনাকে অনেক ধন্যবাদ।
অরিত্র রায় ২

এই উত্তরটি আপ-ভোটিংয়ের কারণ আমি আজ সকালেই আসছিলাম ঠিক এই সমস্যাটি! সমাধানের জন্য ধন্যবাদ!
জনসন

ধন্যবাদ। intent.setFlags (0) সমস্যার সমাধান করেছে। এখন দ্বিতীয় অ্যাপ্লিকেশনটি ঠিকঠাক শুরু হয় এবং কলিং অ্যাপটিতে ফলাফল দেয়
নিয়াজ

5

startActivityForResult()অ্যান্ড্রয়েডের প্রাক-ললিপপ সংস্করণে singleInstanceবা singleTaskকার্যকলাপের সাথে কাজ করে না । Android 5 যেহেতু এটি কাজ করে ( আরও তথ্যের জন্য এই উত্তরটি দেখুন)।


5

FLAG_ACTIVITY_NEW_TASKআপনার উদ্দেশ্য থাকলে তাও ট্রিগার করে ।

Intent intent = new Intent(this, MyActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivityForResult(intent, REQUEST_CODE);

ধন্যবাদ। আমি আমার ক্রিয়াকলাপে FLAG_ACTIVITY_NEW_TASK যুক্ত করেছি।
চিরাগ সাবসানী

1

আমার সমস্যা ছিল কলিং ক্রিয়াকলাপ নিয়ে। অ্যান্ড্রয়েড ম্যানিফেস্টে এর ঘোষণায় নিম্নলিখিত সম্পত্তি ছিল:

android:noHistory="true"

এটিকে "ভুয়া" তে পরিবর্তন করে এখন দুর্দান্ত কাজ করে works


1

অ্যাকটিভিটি বন্ধের শেষে রিটার্নের অপেক্ষার বিষয়ে অ্যান্ড্রয়েড ৪.৪ এর একটি ছোট সমস্যা রয়েছে এই আচরণটি সমাধানের জন্য এটি সেট করা গুরুত্বপূর্ণ:

  • সমস্ত ক্রিয়াকলাপে একই কর্মযুক্তি বৈশিষ্ট্য থাকবে। ( TaskAffinity = "[SAME STRING]")
  • launchmode=singleTop,
  • launchIntent.SetFlags(0); // for reset default Intent flags if you launch from package manager

এই সমাধানটি অ্যান্ড্রয়েডের সমস্ত সংস্করণের সাথে কাজ করে

টাস্কঅফিনিটির জন্য এটি দেখুন: https://asyoulook.com/computers%20 &%20internet/android-onactivityresult-being-called-instantly/1004072


1

এছাড়াও, অ্যানড্রয়েড: noHistory = ম্যানিফেস্টের ক্রিয়াকলাপের উপর "সত্য" কিনা তা পরীক্ষা করুন, যদি হ্যাঁ, এটি কাজ করবে না।


0

জন্য ActivityGroupবা TabHostএবং অন্যদের, হয়তো xxxActivityএকটি হল subActivityতার পিতা বা মাতা হন। তারপরে startActivityForResultকাজ করতে পারবেন না তবে পিতামাতারা ফলাফল পেতে পারেন।

  1. getParent().startActivityForResult()আপনার উপ-ক্রিয়াকলাপ থেকে কল করুন

  2. আপনার পিতামাতা (দ্য ActivityGroup) এটি পরিচালনা করতে সক্ষম হবেন onActivityResult। সুতরাং আমি এটির একটি সাবক্লাস তৈরি করেছি ActivityGroupএবং এটি পরিচালনা করেছি onActivityResult

  3. আপনার প্রয়োজন হলে আপনি পুনরায় রুট করতে পারেন যার ফলে সাব-অ্যাক্টিভিটিতে ফিরে আসে। সবেমাত্র বর্তমান ক্রিয়াকলাপটি পান getLocalActivityManager().getCurrentActivity()। আমার উপ-ক্রিয়াকলাপগুলি একটি কাস্টম ক্রিয়াকলাপ থেকে উত্তরাধিকারী তাই আমি কল করার handleActivityResult(requestCode, resultCode, data)জন্য সেই সাবক্লাসে একটি যুক্ত করেছি ActivityGroup

উদাহরণ: http://www.cnblogs.com/relinson/archive/2012/03/25/startActivity forResult.html



0

onActivityResult()আপনি যদি ম্যানিফেস্ট ফাইলটিতে প্যাকেজ বা শ্রেণীর নাম ভুল বানান RESULT_CANCELEDকরে থাকেন resultCodeতবে তাও পাস হবে ।


0

android:launchMode="singleTop"ক্রিয়াকলাপের জন্য অ্যান্ড্রয়েড ম্যানিফেস্ট সেটে আপনি ফলাফলের সাথে এবং ক্রিয়াকলাপ সেট পতাকাটি খোলার সময় খুলতে চানintent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);


0

আপনি যদি android:noHistory="true"আপনার অ্যান্ড্রয়েড ম্যানিফেস্ট.এক্সএমএলটিতে ক্রিয়াকলাপটিকে সংজ্ঞায়িত করেন তবে এটি এখানে একই সমস্যার কারণ হবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.