অ্যাপ পুনরায় শুরু করার পরিবর্তে পুনরায় চালু হয়


194

আশা করি কেউ আমাকে সমাধান করতে সহায়তা করতে পারেন, যদি সমাধান না হয় তবে কোনও আচরণের জন্য অন্তত ব্যাখ্যা।

সমস্যাটি:

কিছু ডিভাইসগুলিতে, বর্তমান কাজটি আবার চালু করার ক্ষেত্রে লঞ্চার আইকন ফলাফলগুলি টিপুন, অন্যদের উপর এটি প্রাথমিক প্রবর্তনের অভিপ্রায়টি বহিষ্কারের ফলে (কার্যকরভাবে অ্যাপ্লিকেশনটি পুনরায় চালু করার) ফল দেয়। কেন এমন হয়?

বিস্তারিত:

আপনি যখন "লঞ্চার আইকন" টিপেন অ্যাপ্লিকেশনটি সাধারণত শুরু হয় - অর্থাৎ আমি ধরে নিই, Activityক্রিয়া android.intent.action.MAINএবং বিভাগ সহ আপনার প্রথমটির নামের সাথে একটি ইন্টেন্ট চালু করা হয়েছে android.intent.category.LAUNCHER। তবে সবসময় এটি হতে পারে না:

সর্বাধিক ডিভাইসে, আপনি যদি অ্যাপটি ইতিমধ্যে চালু হওয়ার পরে লঞ্চার আইকনটি টিপেন তবে সেই প্রক্রিয়াটিতে বর্তমানে চলমান ক্রিয়াকলাপটি পুনরায় শুরু করা হবে ( প্রাথমিক নয়Activity )। এটি আবার একইভাবে শুরু হয় যেন আপনি এটি ওএস মেনুতে "সাম্প্রতিক কার্যগুলি" থেকে নির্বাচন করেছেন। আমি সমস্ত ডিভাইসে এই আচরণটি চাই ।

তবে নির্বাচিত অন্যান্য ডিভাইসে বিভিন্ন আচরণ ঘটে:

  • মটোরোলা জুমে, আপনি যখন লঞ্চার আইকনটি টিপেন, অ্যাপটি বর্তমানে চলমান নির্বিশেষে সর্বদা প্রাথমিক প্রবর্তন শুরু করবে Activity। আমি ধরে নিয়েছি যে লঞ্চার আইকনগুলি সর্বদা "লঞ্চ" অভিপ্রায় শুরু করে।

  • স্যামসাং ট্যাব 2-এ, আপনি যখন লঞ্চ আইকনটি টিপেন, আপনি যদি সবেমাত্র অ্যাপ্লিকেশনটি ইনস্টল করেছেন, এটি সর্বদা প্রাথমিক Activity(জুম হিসাবে একই) চালু করবে - তবে, ইনস্টলের পরে আপনি ডিভাইসটি পুনরায় চালু করার পরে, লঞ্চ আইকনটি পরিবর্তিত হবে অ্যাপটি আবার চালু করুন ume আমি ধরে নিই যে এই ডিভাইসগুলি ডিভাইস স্টার্টআপে একটি লুকিং টেবিলের মধ্যে "ইনস্টলড অ্যাপ্লিকেশনগুলি" যুক্ত করে যা লঞ্চার আইকনগুলি সঠিকভাবে চলমান কাজগুলি আবার শুরু করতে দেয়?

আমি যে অনেক উত্তর পড়েছি শব্দ আমার সমস্যা অনুরূপ কিন্তু কেবল যোগ android:alwaysRetainTaskState="true"বা ব্যবহার launchMode="singleTop"করার Activityউত্তর হয় না।

সম্পাদনা:

এই অ্যাপ্লিকেশনটির অতি সাম্প্রতিক প্রবর্তনের পরে, আমরা দেখতে পেলাম যে এই আচরণটি প্রথম পুনরায় চালু হওয়ার পরে সমস্ত ডিভাইসে ঘটতে শুরু করেছে । যা আমার কাছে পাগল বলে মনে হচ্ছে তবে পুনঃসূচনা প্রক্রিয়াটি সন্ধান করে আমি আসলে কী ভুল হচ্ছে তা খুঁজে পাচ্ছি না।


1
এটি জিজ্ঞাসা করা তুচ্ছ প্রশ্নের মতো মনে হতে পারে তবে আপনি কি জুমের জন্য আপনার বিকাশকারী বিকল্পগুলিতে "ক্রিয়াকলাপগুলি রাখবেন না" সেটকে সত্য হিসাবে সেট করেছেন?
অ্যান্ড্রু শুস্টার 15

নাহ (আমার ইচ্ছা! :)) - আমি প্রতিটি ক্রিয়াকলাপের জীবনচক্র এবং পটভূমিতে ক্রিয়াকলাপগুলি এখনও উপলব্ধ হিসাবে লগ করেছি (সেগুলি বন্ধ রয়েছে - ধ্বংস হয়নি)। ওএসগুলি তাদের পুনরায় finish()সূচনা করার Activityপরিবর্তে আবার শুরু করার ক্ষেত্রে তাদের সাথে যোগাযোগ করবে বলে মনে হয় ।
গ্রামীণ

1
আপনি যদি হোম বোতাম টিপেন এবং তারপরে লঞ্চার আইকনে ক্লিক করেন তবে আপনি সম্ভবত সচেতন হওয়ায় পুনঃসূচনা আচরণটি অ্যান্ড্রয়েডের জন্য ডিফল্ট। তবে আপনি যদি হোম স্ক্রিনে ফিরে আসতে পিছনের বোতামটি টিপেন তবে বেশিরভাগ ফোন অ্যাপটি শেষ করে ()। অ্যাপটি থেকে বেরিয়ে আসার জন্য আপনি যে কোনও পদ্ধতি ব্যবহার করছেন তা কি বিভিন্ন ডিভাইসে আলাদা? আপনি কি হার্ড / সফট টেকিজকে অদ্ভুতভাবে পরিচালনা করছেন না তা পরীক্ষা করতে অন কিয়আপআপে লগ আউট করতে পারেন?
নিক কার্ডোসো

2
না - আমি উপরে নিশ্চিত হিসাবে সমস্যা সম্পর্কে নিশ্চিত। অ্যাপ্লিকেশনটিকে ব্যাকগ্রাউন্ডে রাখার জন্য হোম ব্যবহার করা (ফিরে আসবে না, যা আপনি ঠিক বলেছেন (ক্রিয়াকলাপটি শেষ করবে))। এটা তোলে Xoom এর কার্য তালিকা থেকে অ্যাপ (ঠিক লঞ্চার থেকে নয়) পুনরায় শুরু করতে তাই backstack স্পষ্টভাবে করেছে সম্ভব না নিহত হয়েছে।
গ্রামীণ

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

উত্তর:


238

আপনি যে আচরণটি ভোগ করছেন তা এআইপিআই ১ থেকে কিছু অ্যান্ড্রয়েড লঞ্চারগুলিতে বিদ্যমান একটি সমস্যার কারণে হয় You আপনি বাগ সম্পর্কে বিশদ পাশাপাশি সম্ভাব্য সমাধানের বিশদ এখানে পাবেন: https://code.google.com/p/android/issues/ বিশদ? আইডি = 2373

এটি স্যামসাং ডিভাইসের পাশাপাশি কাস্টম লঞ্চার / ত্বক ব্যবহারকারী অন্যান্য নির্মাতাগুলিতে তুলনামূলকভাবে সাধারণ সমস্যা। স্টক অ্যান্ড্রয়েড লঞ্চারে সমস্যাটি আমি দেখিনি।

মূলত, অ্যাপ্লিকেশনটি সম্পূর্ণরূপে পুনরায় আরম্ভ হচ্ছে না, তবে অ্যাপ্লিকেশনটি যখন লঞ্চ দ্বারা পুনরায় চালু করা হচ্ছে তখন আপনার লঞ্চ ক্রিয়াকলাপটি শুরু হয়ে ক্রিয়াকলাপের স্ট্যাকের শীর্ষে যুক্ত করা হচ্ছে। আপনি অ্যাপটি পুনরায় চালু করার সময় এবং লঞ্চটির ক্রিয়াকলাপ দেখানো হলে ব্যাক বোতামটি ক্লিক করে আপনি বিষয়টি নিশ্চিত করতে পারেন। এরপরে আপনি অ্যাপটি পুনরায় চালু করার সময় আপনাকে সেই কার্যকলাপে নিয়ে আসা উচিত যা আপনি প্রত্যাশা করেছিলেন।

এই সমস্যাটি সমাধানের জন্য আমি যে কার্য্যক্রমটি বাস্তবায়নের জন্য বেছে নিয়েছি তা হ'ল প্রাথমিক ক্রিয়াকলাপটি শুরু হওয়ার উদ্দেশ্যে অভিপ্রায় ইনটেন্ট.সিএটিইজিআরএইএলএএনএইচআর ক্যাটাগরি এবং ইন্টেন্ট.এ্যাকশন_গ্রাফিকেশন পরীক্ষা করা। যদি এই দুটি পতাকা উপস্থিত থাকে এবং ক্রিয়াকলাপটি মূল কাজের মধ্যে না থাকে (যার অর্থ অ্যাপ্লিকেশনটি ইতিমধ্যে চলছিল) তবে আমি প্রাথমিক ক্রিয়াকলাপে ফিনিশ () কে কল করি। সেই সঠিক সমাধানটি আপনার পক্ষে কাজ নাও করতে পারে, তবে অনুরূপ কিছু হওয়া উচিত।

প্রাথমিক / আরম্ভের ক্রিয়াকলাপের অনক্রিট () এ আমি এখানে যা করছি:

    if (!isTaskRoot()
            && getIntent().hasCategory(Intent.CATEGORY_LAUNCHER)
            && getIntent().getAction() != null
            && getIntent().getAction().equals(Intent.ACTION_MAIN)) {

        finish();
        return;
    }

4
এখনও পর্যন্ত এটি কোনও প্রতিকূল পার্শ্ব প্রতিক্রিয়া ছাড়াই আমার পক্ষে কাজ করে। যৌক্তিক অনুমানের ভিত্তিতে, আমি এটি বৈধ না হওয়ার কোনও কারণ দেখতে পাচ্ছি না।
javahead76

3
আমি মনে করি এটি এই বাগটি মোকাবেলা করার উপযুক্ত উপায়। আমার জন্য কাজ কর.
সকলোভ

3
আমার পক্ষে কাজটি করেছে, প্রায় 8 টি বিভিন্ন ডিভাইসে যাচাই করা হয়েছে। অনেক ধন্যবাদ!
শায়া আজ্নার

3
WOOOO আমার সমস্যাটি ঠিক করেছে গত ২ ঘন্টা ধরে সমাধান খুঁজছিল
জিন রেমন্ড দাহের

2
ধন্যবাদ @ স্টারকেজ ২। কবজির মতো কাজ করেছেন।
রাজীব সাহু

54

এই প্রশ্নটি এখনও ২০১ relevant সালে প্রাসঙ্গিক Today আজ একটি কিউএ পরীক্ষক অ্যান্ড্রয়েড এম এর স্টক লঞ্চার থেকে পুনরায় শুরু করার চেয়ে খনি পুনরায় চালু করার একটি অ্যাপ্লিকেশনটির প্রতিবেদন করেছিলেন

বাস্তবে, সিস্টেমটি বর্তমান টাস্ক-স্ট্যাকটিতে চালু করা ক্রিয়াকলাপটি যুক্ত করছিল , তবে এটি ব্যবহারকারীর কাছে উপস্থিত হয়ে মনে হয়েছিল যেন কোনও পুনরায় চালু হয়েছে এবং তারা তাদের কাজটি হারিয়ে ফেলবে। ক্রমটি ছিল:

  1. প্লে স্টোর থেকে ডাউনলোড করুন (বা সিডেলোড এপিপি)
  2. প্লে স্টোর কথোপকথন থেকে অ্যাপ্লিকেশন চালু করুন: ক্রিয়াকলাপ এ প্রদর্শিত হবে [টাস্ক স্ট্যাক: এ]
  3. ক্রিয়াকলাপ বি তে নেভিগেট করুন [টাস্ক স্ট্যাক: এ -> বি]
  4. 'হোম' বোতাম টিপুন
  5. অ্যাপ্লিকেশন ড্রয়ার থেকে অ্যাপ্লিকেশন চালু করুন: ক্রিয়াকলাপ এ প্রদর্শিত হবে! [টাস্ক স্ট্যাক: এ -> বি -> এ] (ব্যবহারকারী এখান থেকে 'বি' তে কার্যকলাপ করতে 'পিছনে' বোতাম টিপতে পারে)

দ্রষ্টব্য: এডিবি'র মাধ্যমে ডিবাগ APK এর মোতায়েনের জন্য এই সমস্যাটি প্রকাশ পায় না, কেবল প্লে স্টোর থেকে ডাউনলোড করা APK বা সাইড-লোডে। পরবর্তী ক্ষেত্রে, পদক্ষেপ 5 থেকে লঞ্চের অভিপ্রায় পতাকাটি ধারণ করে Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT, তবে ডিবাগের ক্ষেত্রে নয়। অ্যাপ্লিকেশনটি লঞ্চারটি থেকে শীতল-শুরু হয়ে গেলে সমস্যাটি চলে যায়। আমার সন্দেহ হ'ল টাস্কটি একটি ত্রুটিযুক্ত (আরও সঠিকভাবে, অ-মানক) অভিপ্রায় সহকারে তৈরি করা হয়েছে যা কার্য সম্পূর্ণরূপে সাফ না হওয়া পর্যন্ত সঠিক প্রবর্তন আচরণকে বাধা দেয়।

আমি বিভিন্ন ক্রিয়াকলাপ প্রবর্তন করার পদ্ধতিগুলি চেষ্টা করেছি , কিন্তু সেগুলি সেটিংস ব্যবহারকারীর প্রত্যাশা করা স্ট্যান্ডার্ড আচরণ থেকে খুব বেশি বিচ্যুত হয়েছিল: ক্রিয়াকলাপে টাস্কটি পুনরায় শুরু করা বি। কার্য এবং পিছনের স্ট্যাকের গাইডটিতে পৃষ্ঠার নীচে, প্রত্যাশিত আচরণের নিম্নলিখিত সংজ্ঞাটি দেখুন 'একটি কাজ শুরু করা' এর অধীনে:

এই ধরণের একটি ইন্টেন্ট ফিল্টারটি অ্যাপ্লিকেশন লঞ্চারটিতে ক্রিয়াকলাপের জন্য আইকন এবং লেবেল প্রদর্শন করে, ব্যবহারকারীদের ক্রিয়াকলাপটি চালু করার এবং এটি চালু হওয়ার পরে যে কোনও সময় তৈরি হওয়া কার্যটিতে ফিরে আসে।

আমি এই উত্তরটি প্রাসঙ্গিক বলে মনে করেছি এবং নিম্নলিখিতটি আমার মূল ক্রিয়াকলাপ (এ) এর 'অনক্রিয়েট' পদ্ধতিতে প্রবেশ করিয়েছি যাতে ব্যবহারকারী অ্যাপ্লিকেশনটি খুললে এটি যথাযথভাবে পুনরায় শুরু হয়।

                    /**
     * Ensure the application resumes whatever task the user was performing the last time
     * they opened the app from the launcher. It would be preferable to configure this
     * behavior in  AndroidMananifest.xml activity settings, but those settings cause drastic
     * undesirable changes to the way the app opens: singleTask closes ALL other activities
     * in the task every time and alwaysRetainTaskState doesn't cover this case, incredibly.
     *
     * The problem happens when the user first installs and opens the app from
     * the play store or sideloaded apk (not via ADB). On this first run, if the user opens
     * activity B from activity A, presses 'home' and then navigates back to the app via the
     * launcher, they'd expect to see activity B. Instead they're shown activity A.
     *
     * The best solution is to close this activity if it isn't the task root.
     *
     */

    if (!isTaskRoot()) {
        finish();
        return;
    }

আপডেট: এই ক্রিয়াকলাপটি সরাসরি কাজের মূলটিতে রয়েছে কিনা তা সন্ধানের উদ্দেশ্যে উদ্দেশ্য সমাধানগুলি পার্সিং থেকে সমাধানটিকে সরিয়ে নিয়েছে। মেইন ক্রিয়াকলাপটি খোলার জন্য (বাড়ি থেকে লঞ্চ করা, 'আপ' বোতামটি লঞ্চ করা, প্লে স্টোর থেকে লঞ্চ করা ইত্যাদি) বিভিন্ন উপায়ের সাথে ইন্টেন্ট ফ্ল্যাগগুলি ভবিষ্যদ্বাণী করা এবং পরীক্ষা করা শক্ত are


4
"অ্যাপ্লিকেশনটি লঞ্চার থেকে শীতল-শুরু হয়ে গেলে সমস্যাটি চলে যায়" " এটি সবচেয়ে অদ্ভুত অংশ এবং আমি এটিও পর্যবেক্ষণ করেছি - প্রথম লঞ্চের পরে অ্যাপটিকে মেরে ফেলা হচ্ছে, এটি আবার স্বাভাবিকভাবে আচরণ শুরু করে। এমন একটি বিজোড় বাগ। এটিকে পুরোপুরি বিশ্লেষণ করার জন্য এবং সমাধানের জন্য ধন্যবাদ।
ওডে

11
দ্রষ্টব্য: আপনি অ্যাপ্লিকেশনটির গুগল প্লে পৃষ্ঠা থেকে "ওপেন" ব্যবহার করে প্রাথমিকভাবে এটিকে পরিষ্কার করার পরে (শীতল-সূচনা দিয়ে) সমস্যার সমাধান করে পুনরায় উত্পাদনের বিষয়টি পেতে পারেন, এমনকি আপনি এপিডিকে অ্যান্ড্রয়েড স্টুডিওর মাধ্যমে ইনস্টল করেছেন । আমি কাজটি স্থির করে যাচাই করার জন্য এটি খুব দরকারী বলে মনে করি।
ওডে

সুন্দর ব্যাখ্যা!
karanatwal.github.io

এই ব্যাখ্যার জন্য ধন্যবাদ :)
AndroidEnthuiast

2
এটি অনেকগুলি অ্যাপ্লিকেশনের সাথে ঘটে। গুগল ফটোগুলি আমি যা পরীক্ষা করেছি সেগুলি একটি প্রধান।
রঘুবংশ মণি

19

আহা! (tldr; নীচে বোল্ড বিবৃতি দেখুন)

আমি সমস্যাটি পেয়েছি ... আমার মনে হয়।

সুতরাং, আমি একটি অনুমান দিয়ে শুরু করব। আপনি যখন লঞ্চারটি টিপুন, এটি হয় পূর্বনির্ধারিত আরম্ভ হয় Activityবা, Taskপূর্ববর্তী লঞ্চটির কোনও সূচনা যদি খোলা থাকে তবে এটি এটিকে সামনে এনে দেয়। অন্য কোনও উপায় রাখুন - আপনার নেভিগেশনের কোনও পর্যায়ে আপনি যদি একটি নতুন Taskএবং finishপুরানো তৈরি করেন তবে আরম্ভকারী আর আপনার অ্যাপ্লিকেশনটি আরম্ভ করবে না।

যদি এই ধারণাটি সত্য হয় তবে আমি দৃ sure়ভাবে নিশ্চিত যে এটি একটি বাগ হওয়া উচিত, প্রদত্ত যে প্রত্যেকে Taskএকই প্রক্রিয়াতে রয়েছে এবং প্রথমটি তৈরির মতো পুনঃসূচনাপ্রার্থী বৈধ?

আমার সমস্যাটি তখন দু'একটি থেকে এই পতাকাগুলি সরিয়ে ফিক্স করা হয়েছিল Intents:

i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK );

যদিও এটি একেবারে সুস্পষ্টরূপে FLAG_ACTIVITY_NEW_TASKএকটি নতুন সৃষ্টি করেছে Task, তবুও আমি প্রশংসা করি না যে উপরের ধারণাটি কার্যকর হয়েছিল। আমি এটিকে একজন অপরাধী হিসাবে বিবেচনা করেছি এবং এটি পরীক্ষার জন্য সরিয়ে দিয়েছি এবং আমার এখনও সমস্যা ছিল তাই আমি এটিকে বরখাস্ত করি। তবে, আমার এখনও নীচের শর্ত ছিল:

i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)

আমার স্প্ল্যাশ স্ক্রিনটি Activityউপরের পতাকাটি ব্যবহার করে আমার অ্যাপে "প্রধান" শুরু করছিল was সামগ্রিকভাবে, যদি আমি আমার অ্যাপ্লিকেশনটি "পুনঃসূচনা" করে থাকি এবং Activityতা এখনও চলতে থাকে, তবে আমি তার পরিবর্তে রাষ্ট্রীয় তথ্য সংরক্ষণ করব।

আপনি ডকুমেন্টেশনে লক্ষ্য করবেন এটিতে কোনও নতুন শুরু করার বিষয়ে কোনও উল্লেখ করা হয়নি Task:

যদি সেট করা থাকে এবং চালু করা ক্রিয়াকলাপটি ইতিমধ্যে বর্তমান কার্যক্রমে চলছে, তবে সেই ক্রিয়াকলাপের নতুন উদাহরণ শুরু করার পরিবর্তে, এর উপরে থাকা সমস্ত ক্রিয়াকলাপ বন্ধ হয়ে যাবে এবং এই উদ্দেশ্যটি সরবরাহ করা হবে (এখন শীর্ষ) নতুন উদ্দেশ্য হিসাবে পুরানো ক্রিয়াকলাপ।

উদাহরণস্বরূপ, ক্রিয়াকলাপ সমন্বিত একটি কার্য বিবেচনা করুন: ক, বি, সি, ডি যদি ডি স্টার্টঅ্যাক্টিভিটি () কে ক্রিয়াকলাপ বি এর উপাদানটির সাথে সমাধান করে এমন একটি উদ্দেশ্য সহ কল ​​করে তবে সি এবং ডি সমাপ্ত হবে এবং বি প্রদত্ত উদ্দেশ্য গ্রহণ করবে , স্ট্যাকের ফলে এখন রয়েছে: এ, বি।

উপরের উদাহরণে ক্রিয়াকলাপ বি বর্তমানে চলমান দৃষ্টান্তটি হয় আপনি এখানে নতুন নতুন উদ্দেশ্যটি তার অন্নইন্টেন্ট () পদ্ধতিতে শুরু করবেন বা নিজেই শেষ হয়ে নতুন উদ্দেশ্য নিয়ে পুনরায় আরম্ভ করবেন। যদি এটির প্রবর্তন মোডটিকে "একাধিক" (ডিফল্ট) হিসাবে ঘোষণা করেছে এবং আপনি একই উদ্দেশ্যে FLAG_ACTIVITY_SINGLE_TOP সেট না করে রেখেছেন, তবে এটি সমাপ্ত হবে এবং পুনরায় তৈরি হবে; অন্যান্য সমস্ত লঞ্চ মোডের জন্য বা যদি FLAG_ACTIVITY_SINGLE_TOP সেট করা থাকে তবে এই ইন্টেন্টটি বর্তমানের ইনস্ট্যান্ট-এর নিউইন্টেন্টে সরবরাহ করা হবে)

এই লঞ্চ মোডটি FLAG_ACTIVITY_NEW_TASK এর সাথে একত্রে ভাল প্রভাবের জন্যও ব্যবহার করা যেতে পারে: যদি কোনও কার্যের রুট ক্রিয়াকলাপটি শুরু করতে ব্যবহৃত হয়, তবে এটি বর্তমানে সেই কার্যের কোনও চলমান উদাহরণটিকে অগ্রভাগে নিয়ে আসবে এবং তারপরে এটির মূল অবস্থানে পরিষ্কার করবে। এটি বিশেষত দরকারী, উদাহরণস্বরূপ, বিজ্ঞপ্তি পরিচালক থেকে কোনও ক্রিয়াকলাপ শুরু করার সময়।

সুতরাং, আমি নীচে বর্ণিত হিসাবে পরিস্থিতি ছিল:

  • ABসঙ্গে চালু FLAG_ACTIVITY_CLEAR_TOP, Aশেষ।
  • Bকোনও পরিষেবা পুনরায় চালু করতে ইচ্ছুক তাই Aপরিষেবাটি পুনঃসূচনা যুক্তি এবং UI (কোনও পতাকা নেই) ব্যবহারকারীকে প্রেরণ করে ।
  • ABFLAG_ACTIVITY_CLEAR_TOP দিয়ে চালু হয়, Aসমাপ্ত।

এই পর্যায়ে দ্বিতীয় FLAG_ACTIVITY_CLEAR_TOPপতাকাটি আবার শুরু হচ্ছে Bযা টাস্ক স্ট্যাকের মধ্যে রয়েছে। আমি ধরে নিচ্ছি এটি অবশ্যই ধ্বংস করবে Taskএবং একটি নতুন শুরু করবে, আমার সমস্যা সৃষ্টি করবে, যা আপনি আমাকে জিজ্ঞাসা করলে এটি দেখা খুব কঠিন পরিস্থিতি!

সুতরাং, যদি আমার সমস্ত অনুমান সঠিক হয়:

  • Launcherশুধুমাত্র প্রাথমিকভাবে নির্মিত টাস্ক শুরু
  • FLAG_ACTIVITY_CLEAR_TOPএটি, যদি কেবলমাত্র অবশিষ্টটি পুনরায় আরম্ভ করে Activity, একটি নতুন পুনরায় তৈরিও করেTask

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

2
আমি বুঝতে পারি যে এটি বোঝাতে চাইছে না - তবে পরীক্ষার এবং ত্রুটির মধ্য দিয়ে আমার ক্ষেত্রে এটি ঘটে be এই পতাকাগুলি সরানো সমস্যার সমাধান করে।
গ্রিম

এটি সমস্ত শর্তে সমস্ত ডিভাইসে একটি নিখুঁত জীবনবৃত্তান্ত তৈরি করে না।
danny117

পতাকাগুলি সরানো আমার জন্য সমস্যাটি স্থির করেছে। ধন্যবাদ
সিলার_05

আমার কাছে স্প্ল্যাশ স্ক্রিন / মূল পর্দার দৃশ্য আছে তবে আমি স্প্ল্যাশ থেকে প্রধানতে স্থানান্তরিত করতে কোনও পতাকা ব্যবহার করছি না, তবুও বিষয়টি আমার কাছে পুনরুত্পাদনযোগ্য - এই সমাধানটি আমার পক্ষে কাজ করছে না।
ror

12

স্যামসাং ডিভাইসে আমার একই সমস্যা ছিল। অনেক খোঁজাখুঁজির পরে, এই উত্তরগুলির কোনওটিই আমার পক্ষে কার্যকর হয়নি। আমি দেখতে পেলাম যে AndroidManLive.xML ফাইলটিতে ( ) launchModeসেট করা আছে । বৈশিষ্ট্যটি সরানো আমার সমস্যা স্থির করেছে।singleInstanceandroid:launchMode="singleInstance"launchMode


প্রকৃতপক্ষে, এটি আমার জন্যও কৌশলটি করেছিল। আমি এই উত্তরটি অন্য একটি এসও প্রশ্নের সহায়ক হিসাবে খুঁজে পেয়েছি: stackoverflow.com/a/21622266/293280 । এবং এটি বিভিন্ন ধরণের launchModeমূল্যবোধগুলি লিখে রাখে
জোশুয়া পিন্টার

এই ফিক্সটি আমার পক্ষে কাজ করেছিল! এটি মেনিফেস্টে নয় বরং মূল ক্রিয়াকলাপ শ্রেণীর ক্রিয়াকলাপের বৈশিষ্ট্যে যুক্ত হয়েছে।
ক্যালিন ভ্লাসিন

@ ক্যালিনভ্লাসিন আপনি কীভাবে আমাকে লঞ্চমোডটি ব্যবহার করেছিলেন ঠিক তা দেখাতে পারতেন? কোথায় রেখেছিলে? বর্তমানে আমার কাছে এটির মতো তবে এটির কারণটি ঘটছে: <ক্রিয়াকলাপ অ্যান্ড্রয়েড: নাম = "U ইউআই.ল্যান্ডিং.মাইঅ্যাক্টিভিটি" অ্যান্ড্রয়েড: কনফিগারেশন = "লোকেল | লেআউটডাইরেশন" অ্যান্ড্রয়েড: লঞ্চমোড = "সিঙ্গলটপ" অ্যান্ড্রয়েড: উইন্ডোসফটআইনপুটমোড = "stateAlwaysHID | সমন্বয় পুনরায় আকার দিন ">
j2emanue

এটি আমার সমস্যাও ছিল। আমি এই গৃহীত উত্তর (isTaskRoot সাথে ব্যবহার করা উচিত মনে করি ...
behelit

1

আমার ক্যাট এস 60 এ, আমি বিকাশকারী বিকল্পগুলিতে "ক্রিয়াকলাপগুলি রাখবেন না" সক্ষম করেছিলাম, এটি আবার অক্ষম করে আমাকে অ্যাপ্লিকেশনগুলির স্থিতি না ছাড়াই অ্যাপ্লিকেশনগুলিতে স্যুইচ করার অনুমতি দেয় ...


কীভাবে ধারণা নেই তবে এটি আমার ডিভাইসে চালু ছিল।
রিয়েলপ্রো

0

এই সমাধানটি আমার পক্ষে কাজ করেছে:

    @Override
    public boolean onKeyUp(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            Intent startMain = new Intent(Intent.ACTION_MAIN);
            startMain.addCategory(Intent.CATEGORY_HOME);
            startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(startMain);
            return false;
        }
        else
            return super.onKeyUp(keyCode, event);
    }

ক্রেডিট: ব্যাক ক্লিক করে আমার অ্যান্ড্রয়েড অ্যাপ্লিকেশনটি ছোট করতে হবে

সমস্ত ডিভাইসে কাজ নাও করতে পারে, তবে ব্যাক বোতামটি চাপলে সাফল্যের সাথে হোম বোতামের আচরণ তৈরি করা হয়, এভাবে ক্রিয়াকলাপটি শেষ করার পরিবর্তে বন্ধ করে দেওয়া হয়।


আকর্ষণীয় কৌতুক কিন্তু বলা হিসাবে সমস্যাটি সমাধান করে না। যদিও অন্যান্য সমস্যা / প্রশ্নের জন্য খুব দরকারী।
গ্রামীণ

ব্যাক বোতামটির একটি নির্দিষ্ট উদ্দেশ্য রয়েছে এবং ব্যবহারকারীরা ব্যাক বোতামটি যা করার কথা বলে তা করার প্রত্যাশা করে। এটিকে যে কোনও উপায়ে ওভাররাইড করা ভুল এবং আমার মতে চূড়ান্ত পেশাগত।
বাগগুলি

-1

আমারও একই সমস্যা ছিল, কারণটি ছিল:

(মেইনএকটিভিটিতে কোটলিন কোড)

override fun onBackPressed() {
    finish()
}

সুতরাং আমার লগইনঅ্যাক্টিভিটি থেকে আমার মেইনএ্যাকটিভিটিতে নেভিগেট করার সময় আমি এটি ব্যবহার করি:

    val intent = Intent(this, MainActivity::class.java)
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK)
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
    startActivity(intent)

এই ফ্ল্যাগগুলি ব্যবহার করার সময় আমার মেইনএ্যাকটিভিটিতে কোনও অনব্যাকপ্রেসড () রাখতে হবে না, এটি ব্যাক ক্লিকের পরে প্রাকৃতিকভাবে অ্যাপটি প্রস্থান করবে। এবং হোম বোতাম টিপে এবং অ্যাপ্লিকেশনটিতে ফিরে যাওয়ার সময় এটি পুনরায় আরম্ভ হয় না।


-2

তাদের অ্যান্ড্রয়েড ফোনে প্রোগ্রামিং এবং এই সমস্যাটি সম্পর্কে অভিজ্ঞতা সম্পর্কে যাদের ধারণা নেই তাদের জন্য সমাধান। এটি বেশিরভাগ অ্যান্ড্রয়েড সংস্করণে আপগ্রেড হওয়ার কারণে ঘটে (কেবলমাত্র আমার অনুমান)। আপগ্রেড করার পরে আপনার সমস্ত অ্যাপ্লিকেশন কম ব্যাটারি ব্যবহার করতে অনুকূলিত হবে। তবে, এটি আপনার ডিভাইসকে ধীর করে দেয়।

কীভাবে সমাধান করব

সেটিংস >> অ্যাপস >> অ্যাপ্লিকেশন সেটিংসে যান (স্ক্রিনে যে কোনও জায়গায় সেটিংস সাইন-এর জন্য সন্ধান করুন- এটি বিভিন্ন ডিভাইসে পৃথক পৃথক) >> ব্যাটারি অপ্টিমাইজেশন (বা অনুরূপ অপটি [চিত্রের বিবরণ এখানে প্রবেশ করুন] [1] চালু) >> সমস্ত সরান অ্যাপ্লিকেশনগুলিকে 'অপ্টিমাইজড নয়' অবস্থা করতে হবে (ম্যানুয়ালি 1 দ্বারা 1 করতে হবে-কিছু ফোনে মঞ্জুরি / অনুমতি দেওয়া হবে)। আপনার প্রবর্তক অ্যাপ্লিকেশনটি 'অপ্টিমাইজড নয়' হওয়া দরকার (আমার ক্ষেত্রে জেন ইউআই লঞ্চার - এটি আমার ধারণা অপরাধী-আপনার যদি সময় থাকে তবে আপনি অনুকূলিতকরণ / অপ্টিমাইজেশন এবং পুনরায় চালু করার চেষ্টা করতে পারেন)। এখন আপনার ফোনটি পুনরায় চালু করুন।(ডেটা / নিরাপদ মোড বা কোনও সমস্যা পুনরায় সেট করার দরকার নেই)

এখন মাল্টিটাস্কিং চেষ্টা করুন। :) লঞ্চার আইকন টিপলে ফলাফলটি এখনকার কাজটি আবার শুরু করা উচিত। :) আপনার ডিভাইস হয়ে উঠবে ব্যাটারি সম্পর্কে চিন্তা করবেন না, এটি যাইহোক ড্রেন হয়ে যাবে।


-8

আপনার ব্যবহারকারীদের কাছে মূল্যবান। সাম্প্রতিক ব্যবহৃত অ্যাপ্লিকেশন তালিকায় কয়েক সপ্তাহ ধরে বসে নিখুঁত জীবনবৃত্তান্ত।

এটি ব্যবহারকারীর কাছে জীবনবৃত্তান্তের মতো মনে হচ্ছে তবে এটি একটি সম্পূর্ণ প্রসারিত শুরু।

পটভূমি: অ্যাপ্লিকেশনগুলির দ্বারা ব্যবহৃত মেমরি যা মূল ক্রিয়াকলাপে কোনও কাজ শুরু করেনি তা পুনরায় দাবি করা সহজ। ওএস সহজেই অ্যাপ্লিকেশনটিকে পুনরায় আরম্ভ করতে পারে আসল বান্ডিলটি অনক্রিয়েটে পাস করেছে। তবে আপনি মূল বান্ডেলে যুক্ত করতে পারেন onSaveInstanceStateসুতরাং আপনার অ্যাপটি ওএস দ্বারা পুনরায় চালু করা হলে আপনি উদাহরণের অবস্থাটি পুনরুদ্ধার করতে পারবেন এবং অ্যাপটি পুনরায় চালু হয়েছে বা পুনরায় চালু হয়েছে কিনা সে বিষয়ে কেউই বুদ্ধিমান নয়। উদাহরণস্বরূপ ক্লাসিক মানচিত্র প্রোগ্রামটি ধরুন। ব্যবহারকারী মানচিত্রে একটি অবস্থানে চলে যায় এবং তারপরে হোম কীটি চাপ দেয়। দুই সপ্তাহ পরে এই ম্যাপিং অ্যাপ্লিকেশনটি ফেসবুক, পানডোরা এবং ক্যান্ডি ক্রাশ সহ সাম্প্রতিক অ্যাপগুলির তালিকায় এখনও রয়েছে। ওএস সম্প্রতি ব্যবহৃত অ্যাপ্লিকেশনগুলির জন্য কেবল অ্যাপের নাম সংরক্ষণ করে না এটি এটি অ্যাপ্লিকেশন শুরু করতে ব্যবহৃত মূল বান্ডিলটিও সংরক্ষণ করে। তবে প্রোগ্রামার কোড করেছেonSaveInstanceState পদ্ধতি তাই অরিগনাল বান্ডলে এখন অ্যাপ তৈরির জন্য প্রয়োজনীয় সমস্ত উপকরণ এবং তথ্য রয়েছে যাতে দেখে মনে হয় এটি আবার শুরু হয়েছিল।

উদাহরণ: অ্যাপ্লিকেশনটি লোড করা আছে এবং কেবলমাত্র সাম্প্রতিক অ্যাপ্লিকেশনগুলির তালিকা থেকে কয়েক সপ্তাহ পরে পুনরায় চালু করতে হবে, কেবলমাত্র সেভিআইনস্ট্যান্সস্টেটে বর্তমান ক্যামেরার অবস্থানটি সংরক্ষণ করুন।

@Override
    public void onSaveInstanceState(Bundle savedInstanceState) {
        super.onSaveInstanceState(savedInstanceState);
        // save the current camera position;
        if (mMap != null) {
            savedInstanceState.putParcelable(CAMERA_POSITION,
                    mMap.getCameraPosition());
        }
    }



@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // get the exact camera position if the app was unloaded.
        if (savedInstanceState != null) {
            // get the current camera position;
            currentCameraPosition = savedInstanceState
                    .getParcelable(CAMERA_POSITION);
        }

দ্রষ্টব্য: আপনিওonRestoreInstanceState পদ্ধতিটি ব্যবহার করতে পারেন তবে উদাহরণটি পুনরুদ্ধার করা আমার পক্ষে আরও সহজ onCreate

এটি আপনার অ্যাপ্লিকেশনটিতে যা ঘটছে তার চেয়ে বেশি সম্ভবত। কিছু ডিভাইসে আপনার অ্যাপ্লিকেশনটি ফ্রি মেমরির জন্য লোড করা হয়। হ্যাঁ এমন কয়েকটি পতাকা রয়েছে যা সহায়তা করে তবে পতাকাগুলি আপনার অ্যাপ্লিকেশনটির প্রতিটি উপকার গ্রহণ করবে না এবং পতাকাগুলি সপ্তাহের মতো ইচ্ছে মতো আপনাকে বাঁচিয়ে রাখবে না onSaveInstanceState। আপনাকে যথাযথ কোড করতে হবে দুই সপ্তাহ পরে আবার শুরু করুন। জটিল অ্যাপ্লিকেশনটির জন্য এটি সহজ কাজ হবে না তবে আমরা আপনার পিছনে রয়েছি এবং এখানে সহায়তা করতে এসেছি।

শুভকামনা


এটি সাধারণ মেমরি উদ্বেগ বা ডিফল্ট "বিরাম স্থিতি" শর্তের কারণে নয়। আমি আমার অ্যাপ্লিকেশনটি অনেক ডিভাইস জুড়ে চেষ্টা করেছি (কিছুতে বড় মেমরির কিছু কম স্মৃতিযুক্ত)।
গ্রামীণ

এই কারণেই আপনি অন পজিশনে থাকা ডেটা সংরক্ষণ করেন আমি আমার অ্যাপ্লিকেশনটি চেষ্টা করেছি যে আমি প্রতিদিন যে ফোনে ব্যবহার করি সেগুলিতে দু'সপ্তাহের মতো পুনরায় শুরু করার চেষ্টা করেছি এবং দুই সপ্তাহ পরে অনক্রিয়েট পদ্ধতিটি কল হওয়ার পরে আপনাকে জানাতে দেব এবং ওস আমি যে বান্ডেলে সেভ করেছি তাতে পাস হয়ে যায় os onSaveSessionState এবং আমি আমার ক্রিয়াকলাপটি যেমন রেখেছি ঠিক তেমনভাবে প্রদর্শন করতে বান্ডলে ডেটা ব্যবহার করি। সুতরাং আমার উত্তরটি পড়ে কেবল তিন দিন হয়ে গেছে সুতরাং আপনি দু'সপ্তাহের পরীক্ষা শেষ করতে পারার কোনও উপায় নেই। সংক্ষিপ্তসার: অ্যাপটি ব্যাকগ্রাউন্ডে থাকা যেকোন সময় বন্ধ হতে পারে।
danny117

@ ড্যানি ১১7 আমি মনে করি না যে গ্রামীণ যে সমস্যাটি অনুভব করছে সে সম্পর্কে আপনার সঠিক ধারণা আছে
স্টারকেজ

আমি গ্রিমের বিষয়টি বুঝতে পারি। কিছু ডিভাইসে অ্যাপ পুনরায় শুরু করার সময় অনক্রিট কল করে। ঠিক আমার এইচটিসি ইভিও (জিঞ্জারব্রেড) এর মতো শোনাচ্ছে যা কেবল স্ক্রিনটি ঘোরানোর জন্য অ্যাপটিকে মেরে ফেলবে। এতে বলা দলিলগুলি দেখুন যাতে অ্যাপটি
onCreate

@ ড্যানি 117 এটি সঠিক, তবে অ্যাপটি পুনরায় চালু করা হলে (যা প্রত্যাশিত) পুনরায় তৈরি করা হচ্ছে এমন একটি ক্রিয়াকলাপের সাথে তাঁর সম্পর্কিত সমস্যাটি সম্পর্কিত নয়, তবে ভুল ক্রিয়াকলাপটি শুরু হচ্ছে
স্টারকেজ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.