ইতিহাসের স্ট্যাক থেকে কোনও ক্রিয়াকলাপ সরানো


382

আমার অ্যাপ্লিকেশনটি সাইনআপের ক্রিয়াকলাপটি দেখায় যখন ব্যবহারকারী প্রথমবার অ্যাপটি চালায়, দেখে মনে হয়:

  1. অ্যাক্টিভিটিস্প্ল্যাশস্ক্রিন (গেমটিতে স্বাগতম, কোনও অ্যাকাউন্টে সাইন আপ করবেন?)
  2. অ্যাক্টিভিটিস্প্ল্যাশস্ক্রিনসাইনআপ (দুর্দান্ত, এই তথ্যটি পূরণ করুন)
  3. ক্রিয়াকলাপ গেমমেইন (প্রধান গেমের পর্দা)

সুতরাং ক্রিয়াকলাপগুলি একে অপরকে ঠিক সেই ক্রমে লঞ্চ করে, যখন ব্যবহারকারী প্রতিটি স্ক্রিনের একটি বোতামের মাধ্যমে ক্লিক করে।

যখন ব্যবহারকারী # 2 থেকে # 3 ক্রিয়াকলাপ থেকে যান, তখন কি ইতিহাসের স্ট্যাকটি সম্পূর্ণ 1 # এবং # 2 মুছা সম্ভব? আমি এটি পছন্দ করি যাতে ব্যবহারকারী যদি # 3 এ থাকে এবং পিছনের বোতামটি হিট করে তবে তারা স্প্ল্যাশ স্ক্রিনে ফিরে আসার পরিবর্তে কেবল হোমস্ক্রিনে চলে যাবে।

আমি মনে করি আমি এটি কাজগুলি দিয়ে সম্পাদন করতে পারি (উদাঃ # 3 এ একটি নতুন টাস্ক শুরু করুন) তবে দেখতে চেয়েছিলেন যে আরও সহজ পদ্ধতি আছে কিনা,

ধন্যবাদ


হোম স্ক্রিনে থাকার পরে, ব্যবহারকারী যখন আপনার অ্যাপ্লিকেশনটি পুনরায় চালু করবেন তখন কী তাকে এ্যাকটিভিটিস্প্ল্যাশস্ক্রিন বা অ্যাক্টিভিটি গেমমেইনে নিয়ে যায়?
তামিল

উত্তর:


632

আপনি সেটিং দ্বারা এই অর্জন করতে পারেন android:noHistory অ্যাট্রিবিউট করতে "true"প্রাসঙ্গিক মধ্যে <activity>আপনার এন্ট্রি AndroidManifest.xmlফাইল। উদাহরণ স্বরূপ:

<activity
    android:name=".AnyActivity"
    android:noHistory="true" />

12
এটি করার সেরা উপায় এটি।
shkschneider

22
সমানভাবে আপনি ব্যবহার করতে পারেন FLAG_ACTIVITY_NO_HISTORY
টিম্ম্ম

34
আমি কোড থেকে এটি কীভাবে অর্জন করতে পারি? কারণ আমি সব সময় এটি করতে চাই না। আমি কেবল কিছু শর্তের অধীনে ইতিহাস থেকে প্রদত্ত ক্রিয়াকলাপ সরাতে চাই।
নমরাথা

8
কেবল সচেতন থাকুন যে noHistory বৈশিষ্ট্যটি ব্যবহার করা সেই ক্রিয়াকলাপটি শেষ করে দেবে, যা উদাহরণস্বরূপ G + লগইনের সাথে অপ্রত্যাশিত আচরণের কারণ হতে পারে। দেখুন: stackoverflow.com/questions/20383878/… আমার অ্যাপটি কোনও চিহ্ন ছাড়াই ক্র্যাশ করে চলেছে বলে এই ত্রুটিটি খুঁজে পেতে আমাকে কিছুটা সময় নিয়েছে।
অ্যাকাপুলকো

13
প্রয়োজনীয় পতাকাটি এটি একটি লিঙ্ক হিসাবে অনুলিপি করা কঠিন, সুতরাং এখানে সহজেই অনুলিপি করা যায় এমন একটি। android:noHistory="true"
মিররফেটে

137

পরেরটি চালু করার সময় আপনি ক্রিয়াকলাপ স্ট্যাক থেকে পূর্ববর্তী ক্রিয়াকলাপটি সরিয়ে ফরোয়ার্ডিং ব্যবহার করতে পারেন। এপিডেমোসে এর উদাহরণ রয়েছে , তবে মূলত আপনি যা করছেন তা কল finish()করার পরে অবিলম্বে কল করা startActivity()


1
হাই ড্যানিয়েল, আমি উদাহরণটির মাধ্যমে পড়েছি, তবে এটি কেবল 1 টি ক্রিয়াকলাপ দ্বারা ইতিহাসের স্ট্যাক সাফ করবে, তাই না? যদি আমার স্ট্যাকটি এ, বি এর মতো দেখায় এবং আমি সি চালু করি, আমি সিটিকে নতুন মূল হতে এবং সম্পূর্ণরূপে এ এবং বি পরিষ্কার করতে চাই sdk উদাহরণে, বি থেকে ফিনিস () কলিংটি আমাকে একটি স্ট্যাক সহ ছেড়ে চলে যাবে , সি, তাই না? ধন্যবাদ।
চিহ্নিত করুন

1
আপনি বি চালু করার সাথে সাথে আপনি সাফ করতে পারেন, এবং সি চালু করার সাথে সাথে সাফ বি; তবে আমি মনে করি আপনি যদি চান তবে আপনি বি থেকে ক এ ফিরে আসতে পারবেন না। যদি সমস্যা হয় তবে আমাকে আরও চিন্তা করতে হবে।
ড্যান লিউ

3
চিহ্নিত করুন, আপনি যা চান তা অর্জন করতে আপনাকে পতাকাটি ব্যবহার করতে হবে: FLAG_ACTIVITY_CLEAR_TOP। আমি আসা করি এটা সাহায্য করবে.
ফ্রান্সিসকো জুনিয়র

3
FLAG_ACTIVITY_CLEAR_TOPকাজ করবে না কারণ সি ইতিমধ্যে ব্যাক স্ট্যাকের মধ্যে নেই।
টিম্ম্ম

1
@ ড্যানিয়েল এপিআইডেমোস-এ অনেকগুলি উদাহরণ রয়েছে। আপনি উদাহরণের নাম প্রস্তাবিত চান?
স্টিফেন

52

46
নোট করুন যে আপনি যে কার্যকলাপে চালু করছেন তার কোনও ইতিহাস সেট করে না। আপনি যে ক্রিয়াকলাপ থেকে আরম্ভ করছেন তার কোনও ইতিহাস না রাখার জন্য, আমি কেবল এটি android:noHistory="true"প্রকাশের মধ্যে সেট করেছি ।
জর্জিসিসি

1
এই কাজ ভাল। intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY)এই পতাকাটি সেট করতে ব্যবহার করুন ।
ভোভোস্ট ইস্ট

1
@ জর্জিসিএসি এটি দরকারী যখন আপনি কখনও কখনও এটি ইতিহাসে রাখতে চান এবং কখনও কখনও আপনি ইতিহাসে এটি চান না।
বিহান ভার্মা

24

এটি সম্ভবত এটি করার আদর্শ উপায় নয়। কারও যদি আরও ভাল উপায় থাকে তবে আমি এটি বাস্তবায়নের অপেক্ষায় থাকব। প্রাক-সংস্করণ -11 এসডিকে দিয়ে আমি এই নির্দিষ্ট কাজটি কীভাবে সম্পাদন করেছি তা এখানে ।

প্রতিটি ক্লাসে যখন আপনি স্পষ্ট সময়টি থেকে দূরে যেতে চান, আপনার এটি করা দরকার:

    ... interesting code stuff ...
    Intent i = new Intent(MyActivityThatNeedsToGo.this, NextActivity.class);
    startActivityForResult(i, 0);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == R.string.unwind_stack_result_id) {
        this.setResult(R.string.unwind_stack_result_id);
        this.finish();
    }
}

তারপরে স্ট্যাক থেকে যে পপগুলির চেইনটি বন্ধ করতে হবে তাকে যখন আপনি এটি শুরু করতে চান কেবল তখনই এই কল করতে হবে:

NextActivity.this.setResult(R.string.unwind_stack_result_id);
NextActivity.this.finish();

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


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

এটি যদি আপনি পরবর্তী ক্রিয়াকলাপে +1
TheMothaShip

23

একটি উপায় 11 এপিআই 11 পূর্বের কাজ করে তা হল ActivityGameMainপ্রথমে শুরু করা , তারপরে onCreateসেই ক্রিয়াকলাপে আপনার ক্রিয়াকলাপ শুরু করুন ActivitySplashScreenActivityGameMainহিসাবে আপনি startActivity স্প্ল্যাশ জন্য খুব শীঘ্রই কল প্রদর্শিত হবে না।

তারপরে আপনি এই ফ্ল্যাগটি ইনটেন্টে সেট করে শুরু করার সময় স্ট্যাকটি সাফ করতে পারেনActivityGameMain :

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

আপনার এটিকে অবশ্যই অ্যাক্টিভিটিস্প্ল্যাশস্ক্রিনে যুক্ত করতে হবে:

@Override
public void onBackPressed() {
    moveTaskToBack(true);
}

যাতে সেই ক্রিয়াকলাপটি আবার চাপ দেওয়া আপনার কাছে ফিরে না যায় ActivityGameMain

আমি ধরে নিলাম আপনি স্প্ল্যাশ স্ক্রিনটি আর ফিরে যেতে চান না, এটি অর্জন করার জন্য আমি এটিতে noHistoryআপনার সেট করার পরামর্শ দিচ্ছি AndroidManifest.xml। তার পরিবর্তে goBackPressedকোডটি আপনার ActivitySplashScreenSignUpক্লাসে রেখে দিন।

তবে আমি এটি ভাঙ্গার কয়েকটি উপায় খুঁজে পেয়েছি। ActivitySplashScreenSignUpদেখানোর সময় একটি বিজ্ঞপ্তি থেকে অন্য অ্যাপ্লিকেশনটি শুরু করুন এবং পিছনের ইতিহাসটি পুনরায় সেট করা হয়নি।

এটির একমাত্র আসল উপায়টি এপিআই 11 এ রয়েছে:

intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);

20

আমি এইভাবে ব্যবহার করি।

Intent i = new Intent(MyOldActivity.this, MyNewActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK)
startActivity(i);

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

8

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

//We want the home screen to behave like the bottom of the activity stack so we do not return to the initial screen
//unless the application has been killed. Users can toggle the session mode with a menu item at all other times.
@Override
public void onBackPressed() {
    //Check the activity stack and see if it's more than two deep (initial screen and home screen)
    //If it's more than two deep, then let the app proccess the press
    ActivityManager am = (ActivityManager)this.getSystemService(Activity.ACTIVITY_SERVICE);
    List<RunningTaskInfo> tasks = am.getRunningTasks(3); //3 because we have to give it something. This is an arbitrary number
    int activityCount = tasks.get(0).numActivities;

    if (activityCount < 3)
    {
        moveTaskToBack(true);
    }
    else
    {
        super.onBackPressed();
    }
}

7

ম্যানিফেস্টে আপনি যুক্ত করতে পারেন:

android:noHistory="true"

<activity
android:name=".ActivityName"
android:noHistory="true" />

আপনি কল করতে পারেন

finish()

স্টার্টঅ্যাক্টিভিটি (..) কল করার সাথে সাথে


2
ম্যানিফেস্টে জিনিস রাখার চেয়ে ক্রিয়াকলাপের পতাকা ব্যবহার করা ভাল।
ট্রেভর হার্ট


4

এটি পাগল যে এই মার্জিত সমাধানের কথা কেউ উল্লেখ করেনি। এটি গ্রহণযোগ্য উত্তর হওয়া উচিত।

SplashActivity -> AuthActivity -> DashActivity

if (!sessionManager.isLoggedIn()) {
    Intent intent = new Intent(context, AuthActivity.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
    context.startActivity(intent);
    finish();
} else {
   Intent intent = new Intent(context, DashActivity.class);
   context.startActivity(intent);
    finish();
}

এখানে কীটি intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); মধ্যস্থতাকারীর জন্য ব্যবহার করা Activity। মাঝারি লিঙ্কটি একবার নষ্ট হয়ে গেলে, DashActivityস্ট্যাকের মধ্যে প্রথমটি এবং শেষটি হবে।

android:noHistory="true"একটি খারাপ সমাধান, কারণ এটি Activityকলব্যাক যেমন হিসাবে নির্ভর করে যখন সমস্যা সৃষ্টি করে onActivityResult। এটি প্রস্তাবিত সমাধান এবং গ্রহণ করা উচিত।


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

4

এটি অনেক দেরিতে তবে আশা করি এটি সাহায্য করবে। বেশিরভাগ উত্তর সঠিক দিকে নির্দেশ করছে না। এই জাতীয় জিনিস জন্য দুটি সহজ পতাকা আছে।

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);

অ্যান্ড্রয়েড ডক্স থেকে:

পাবলিক স্ট্যাটিক ফাইনাল ইন FLAG_ACTIVITY_CLEAR_TASK এপিআই স্তরের 11-এ যুক্ত হয়েছে

If set in an Intent passed to Context.startActivity(), this flag will cause any existing task that would be associated with the

ক্রিয়াকলাপটি ক্রিয়াকলাপ শুরু হওয়ার আগেই সাফ করতে হবে। এটি হ'ল, ক্রিয়াকলাপ অন্যথায় খালি কাজের নতুন মূল হয়ে যায় এবং কোনও পুরানো ক্রিয়াকলাপ শেষ হয়। এটি কেবল FLAG_ACTIVITY_NEW_TASK এর সাথে একত্রে ব্যবহৃত হতে পারে।


1

স্টার্টএটিভিটি (অভিপ্রায়) এর আগে এইটিকে কেবল কল করুন-

       Intent intent = new Intent(ActivityOne.this, ActivityTwo.class);
        this.finish();
        startActivity(intent);

যে ব্যবহারকারীদের "এটি" তে ত্রুটি রয়েছে, তাদের এটিকে "ActivityOne.this"
নিনটিত

1

ইতিহাস থেকে কোনও ক্রিয়াকলাপ সরিয়ে ফেলার কাজটি আপনি চান না এমন কার্যকলাপের আগে পতাকাটি সেট করে is

A-> বি-> সি> ডি

ধরুন A, B, C এবং D হল 4 টি ক্রিয়াকলাপ যদি আপনি B এবং C সাফ করতে চান তবে পতাকা সেট করুন

intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);

ক্রিয়াকলাপ এ এবং বি

এখানে কোড বিট

Intent intent = new Intent(this,Activity_B.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
startActivity(intent);

0
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            super.finishAndRemoveTask();
        }
        else {
            super.finish();
        }

-7

এটা চেষ্টা কর:

intent.addFlags(Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY)

এটি এপিআই স্তর 1, লিঙ্কটি পরীক্ষা করুন


2
এই কি করার কথা? অবশ্যই সমস্যা সমাধানে সমস্যা সমাধান করে না।
রডরিগো-সিলভিরা

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