অ্যান্ড্রয়েড: পিছনের স্ট্যাক থেকে পূর্ববর্তী সমস্ত ক্রিয়াকলাপ সরান


119

আমি যখন আমার প্রোফাইল ক্রিয়াকলাপের লগআউট বোতামে ক্লিক করি তখন আমি ব্যবহারকারীকে লগইন পৃষ্ঠায় নিয়ে যেতে চাই , যেখানে তাকে নতুন শংসাপত্র ব্যবহার করতে হবে।

তাই আমি এই কোডটি ব্যবহার করেছি:

Intent intent = new Intent(ProfileActivity.this,
        LoginActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

মধ্যে onButtonClickলগ আউট বোতাম করুন।

তবে সমস্যাটি যখন আমি লগইন ক্রিয়াকলাপের ডিভাইস ব্যাক বোতামটি ক্লিক করি তখন এটি আমাকে প্রোফাইলএক্টিভিটিতে নিয়ে যায়। আমি লগইনঅ্যাক্টিভিটির ডিভাইস ব্যাক বোতাম টিপলে অ্যাপ্লিকেশনটি বন্ধ হয়ে যাওয়ার আশা করছিলাম।

আমি কি ভুল করছি?

আমি android:launchMode="singleTop"আমার লগইনঅ্যাক্টিভিটির জন্য ম্যানিফেস্টে যুক্ত করেছি

ধন্যবাদ


@GauravVashisth আমি শুধু এই সমাধান নিম্নলিখিত ছিল stackoverflow.com/questions/5794506/...
Archie.bpgc

@ abbas.aniefa এই সমাধানটি আমি কিছুটা জটিল। সমস্ত পিছনের স্ট্যাকটি সাফ করার একমাত্র উপায়। কারণ আমার 30+ ক্রিয়াকলাপ রয়েছে তাই তাদের সকলের জন্য আমার এই সম্প্রচার কোডটি লেখা উচিত
Archie.bpgc

এটির পরে চেষ্টা করুন, স্ট্যাকওভারফ্লো / প্রশ্নগুলি 10961481/… । ব্রডকাস্ট ব্যবহার করা আরও ভাল সমাধান।
abbas.aniefa

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

আপনার আসল কোডটি আসলে এপিআই লেভেল 11 বা ততোধিকের জন্য একটি টুইঙ্কের সাথে কাজ করে। আপনি শুধু পতাকা একটি একক কলে একত্র করা প্রয়োজন: intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);আমি এই প্রশ্নের থেকে উত্তর পেয়েছিলাম: stackoverflow.com/questions/3473168/...
jokeefe

উত্তর:


303

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

জাভা

Intent i = new Intent(OldActivity.this, NewActivity.class);
// set the new task and clear flags
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(i);

Kotlin

val i = Intent(this, NewActivity::class.java)
// set the new task and clear flags
i.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
startActivity(i)

তবে এটির জন্য এপিআই স্তর> = 11 প্রয়োজন।


বলছি, ডকুমেন্টেশন পড়ুন FLAG_ACTIVITY_CLEAR_TASK। এটি পাওয়ার আনুষ্ঠানিক উপায় is অ্যাপ্লিকেশনটিতে সমস্ত ক্রিয়াকলাপ পরিবর্তন করার দরকার নেই।
অ্যালিকেলজিন-কিলাকা

এটি বিজ্ঞপ্তিগুলির জন্য কাজ করে না stackoverflow.com/questions/24873131/…
স্যাম

আমার আমার মিনিপিআই = 16 রয়েছে, সুতরাং এটি আমার জন্য পুরোপুরি ঠিকঠাক কাজ করছে। যাইহোক, আমি লক্ষ্য করেছি যে ভিউ এক্সিকিউশনটি API> 21 এর সাথে কিছুটা স্বস্তিযুক্ত এবং এপিআই <21 এর সাথে মসৃণ। কেউ কি একই সমস্যা অনুভব করছেন?
রেড এম

1
এটি ক্রিয়াকলাপগুলির জন্য একটি নতুন টাস্ক তৈরি করবে
রোহিত

@ কেজিয়ান্নাকাকিস নিঃসন্দেহে সমাধান কাজ করছে যদি আমাদের কেবল একটি কাজ (ক্রিয়াকলাপ ব্যাক স্ট্যাক) থাকে তবে যখন আমাদের একাধিক কাজ থাকে (ক্রিয়াকলাপ স্ট্যাক) এটি কাজ করে না। প্রাক্তন- ধরা যাক আমার আমার অ্যাপ্লিকেশন এ, বি, সি এবং ডি এর জন্য চারটি ক্রিয়াকলাপ আছে ধরুন আমার কাছে দুটি ক্রিয়াকলাপ ফিরে আছে এ-> বি-> সি (পটভূমি) এবং ডি-> এ-> বি (পূর্বভূমি) এবং যদি আমি আমার বর্তমান স্ট্যাক (ডি-> এ-> বি) থেকে আপনার কল্পনাটি কী ঘটবে তা আমার বর্তমান স্ট্যাকটি (ডি-> এ-> বি) পরিষ্কার করুন এবং খোলার ক্রিয়াকলাপ এ এবং যখন আমি এটি পিছনে টিপব তখন এটি আমার কল্পনা স্ট্যাটাসের সাথে কল করুন অ্যাপ্লিকেশন তবে আমি সাম্প্রতিক অ্যাপ্লিকেশন বোতাম টিপলে আমি আমার অ্যাপের দুটি পিছনের স্ট্যাক দেখতে পাচ্ছি।
রাহুল পেরেটা

31

লগআউট বোতামটি ব্যবহার করার পরে আপনার সমস্ত অ্যাপ্লিকেশনটির ক্রিয়াকলাপ সাফ করার একটি সমাধান এখানে রয়েছে।

যতবারই আপনি কোনও কার্যকলাপ শুরু করেন, এটিকে এভাবে শুরু করুন:

Intent myIntent = new Intent(getBaseContext(), YourNewActivity.class);
startActivityForResult(myIntent, 0);

আপনি যখন পুরো অ্যাপটি বন্ধ করতে চান, এটি করুন:

setResult(RESULT_CLOSE_ALL);
finish();

আপনি সমস্ত ক্রিয়াকলাপ বন্ধ করতে চান এমন সিগন্যাল দেওয়ার জন্য একটি অনন্য পূর্ণসংখ্যার সাথে RESULT_CLOSE_ALL একটি চূড়ান্ত গ্লোবাল ভেরিয়েবল।

তারপরে প্রতিটি ক্রিয়াকলাপের onActivityResult(...)কলব্যাক সংজ্ঞায়িত করুন সুতরাং যখন কোনও ক্রিয়াকলাপ RESULT_CLOSE_ALL মান সহ ফিরে আসে, তখন এটিও কল করে finish():

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    switch(resultCode)
    {
    case RESULT_CLOSE_ALL:
        setResult(RESULT_CLOSE_ALL);
        finish();
    }
    super.onActivityResult(requestCode, resultCode, data);
}

এটি ক্যাসকেড প্রভাব তৈরি করবে যা আপনার সমস্ত ক্রিয়াকলাপ বন্ধ করে দেয়।

এটি তবে একটি হ্যাক এবং startActivityForResultএমনভাবে ব্যবহার করে যাতে এটি ব্যবহারের জন্য ডিজাইন করা হয়নি।

সম্ভবত আরও ভাল উপায় এটি এখানে প্রদর্শিত হিসাবে সম্প্রচার রিসিভার ব্যবহার করা হবে:

লগআউটে, কেবলমাত্র লগ-ইন করা ক্রিয়াকলাপগুলি খোলার থেকে "পিছনে" বোতামটি রোধ করে ক্রিয়াকলাপের ইতিহাসের স্ট্যাক সাফ করুন

অন্যান্য পদ্ধতিগুলির জন্যও এই থ্রেডগুলি দেখুন:

অ্যান্ড্রয়েড: পিছনের স্ট্যাকটি সাফ করুন

পূর্ববর্তী সমস্ত ক্রিয়াকলাপ শেষ করুন


4
আপনি যখন ইতিহাসে প্রায় 30 টি ক্রিয়াকলাপ করেন তখন কি এটি সম্ভব?
রাকেশ গন্ডালিয়া

4
হতে হবে. তবে ইতিহাসে যদি আপনার 30 টি ক্রিয়াকলাপ থাকে তবে আপনি নিজের নকশাটি পরিবর্তনের বিষয়ে বিবেচনা করতে পারেন। 30 দেখে মনে হচ্ছে অনেক বেশি এবং অ্যান্ড্রয়েড এগুলি নিজেই মেরে ফেলবে।
অনুপ কাউকুর

1
এটি এটি করার একটি দরিদ্র উপায় বলে মনে হচ্ছে। @ রকেশগনদালিয়া'র উত্তর প্রশ্নটি বৈধ বলে মনে হচ্ছে। 30 সম্ভবত কেবলমাত্র একটি সংখ্যা যা 'উচ্চ' ক্রিয়াকলাপের প্রতিনিধিত্ব করে। এই উত্তরটি আরও ভাল দেখাচ্ছে: stackoverflow.com/a/3008684/243709
আমান আলম

এই উত্তর দুর্দান্ত। আপনি ব্যাকস্ট্যাকে আপনার ক্রিয়াকলাপগুলিতে ইভেন্টগুলি প্রেরণের জন্য ইভেন্টবাস গ্রন্থাগারটিও ব্যবহার করতে পারেন। github.com/greenrobot/EventBus
স্টান

অভিপ্রায় সহ সাধারণ 'ইন্টেন্ট.এফএলএজি_এসিটিভিটি_স্লেয়ার_টপ' পতাকা ব্যবহার করা আরও ভাল
নবীন রাও

18

ক্রিয়াকলাপের স্ট্যাক সম্পূর্ণরূপে সাফ করার জন্য আপনি টাস্কস্ট্যাকবিল্ডার ব্যবহার করে একটি নতুন টাস্ক স্ট্যাক তৈরি করতে চান, উদাহরণস্বরূপ:

Intent loginIntent = LoginActivity.getIntent(context);
TaskStackBuilder.create(context).addNextIntentWithParentStack(loginIntent).startActivities();

এটি কেবলমাত্র একটি নতুন, ক্লিন টাস্ক স্ট্যাক তৈরি করবে না, যদি আপনার লগইনঅ্যাক্টিভিটির কোনও প্যারেন্ট ক্রিয়াকলাপ থাকে তবে এটি "আপ" বোতামটির যথাযথ কাজ করার অনুমতি দেয়।


1
এটি করার সেরা উপায় এটি।
পল বার্ক

FLAG_ACTIVITY_NEW_TASKবা finishAffinity()আমার জন্য কাজ করে না। শুধুমাত্র এই উত্তরটির উদ্দেশ্য সমাধান হয়েছে।
টিএম

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

17

finishAffinity()এপিআই 16 এ যুক্ত হয়েছে ActivityCompat.finishAffinity()previous পূর্ববর্তী সংস্করণগুলিতে ব্যবহার করুন । যখন আপনি কোনও ক্রিয়াকলাপ উদ্দেশ্য ব্যবহার করে আরম্ভ করবেন এবং বর্তমান ক্রিয়াকলাপটি শেষ করবেন। ActivityCompat.finishAffinity()পরিবর্তে এখন ব্যবহার করুন finish()। এটি বর্তমান ক্রিয়াকলাপের নীচে স্ট্যাক করা সমস্ত ক্রিয়াকলাপ শেষ করবে। এটা আমার জন্য ভালই কাজ করে।


3
এটি আসলেActivityCompat.finishAffinity()
বার্গা

finishAffinity()একই সখ্যতার পিছনের স্ট্যাকটিতে উপস্থিত সমস্ত ক্রিয়াকলাপের সাথে বর্তমান ক্রিয়াকলাপ শেষ করে fin
নীরজ সেওয়ানি

10

আমার জন্য কি কাজ করেছে

Intent intent = new Intent(getApplicationContext(), HomeActivity.class);
ComponentName cn = intent.getComponent();
Intent mainIntent = IntentCompat.makeRestartActivityTask(cn);
startActivity(mainIntent);

5

আমি আপনাকে যা প্রস্তাব করতে পারি তার একটি সম্ভাব্য সমাধান হ'ল android:launchMode="singleTop"আমার প্রোফাইলএক্টিভিটির জন্য ম্যানিফেস্টে যুক্ত করা । এবং যখন লগ আউট ক্লিক করা হয় আপনি আবার লগঅফ শুরু করতে পারেন আপনি লগইনঅ্যাক্টিভিটি। লগআউটে আপনি এই কল করতে পারেন।

Intent in = new Intent(Profile.this,Login.class);
                in.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                startActivity(in);
                finish();

আমি এটি করেছি, যা ঘটেছিল তা হল: যখন আমি ব্যাক বোতামটি ক্লিক করি তখন এটি আমাকে অ্যাক্টিভিটিতে নিয়ে যায় যেখানে থেকে আমি প্রোফাইলএকটিভিটিতে এসেছিলাম
আর্কি.বিপিজিসি

এটি ঘটতে পারে কারণ আপনি ফিনিস () কল না করে একটি নতুন উদ্দেশ্য কল করে প্রোফাইলঅ্যাক্টিভিটিতে এসেছিলেন; আপনি কীভাবে লগইনঅ্যাক্টিটি বাদ দিয়ে অন্যান্য ক্রিয়াকলাপ থেকে প্রোফাইলএক্টিভিটিতে আসছেন?
অ্যান্ড্রয়েড

আমি একই প্রশ্ন অতিক্রম করছি। আমি মনে করি যখন লগিনের অভিপ্রায়টি সিস্টেম দ্বারা ধ্বংস হয়ে যায় তখন স্মরণে না থাকার কারণে বলুন it
ব্যবহারকারী 1914692

5

API 11+ এর জন্য আপনি এটি ব্যবহার করতে পারেন Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK:

Intent intent = new Intent(this, MyActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK);
this.startActivity(intent);

এটি সম্পূর্ণ পূর্ববর্তী সমস্ত ক্রিয়াকলাপ (গুলি) সাফ করে এবং নতুন ক্রিয়াকলাপ শুরু করবে।


4

আপনি চেষ্টা করতে পারেন finishAffinity(), এটি সমস্ত বর্তমান ক্রিয়াকলাপ বন্ধ করে অ্যান্ড্রয়েড ৪.১-এর উপরে এবং তার উপরে কাজ করে


1
ফিনিশএফিনিটি () এপিআই 16 এ যুক্ত হয়েছে previous আমি আমার জন্য ভাল কাজ।
অনুরাগ শ্রীবাস্তব

2

আমিও একই সমস্যার মুখোমুখি ...

লগইন ক্রিয়াকলাপে আমি যা করি তা হ'ল।

    Intent myIntent = new Intent(MainActivity.this, ActivityLoggedIn.class);
    finish();
    MainActivity.this.startActivity(myIntent);  

লগআউটে

   Intent myIntent = new Intent(ActivityLoggedIn.this, MainActivity.class);
   finish();
   ActivityLoggedIn.this.startActivity(myIntent);

এটি ভালভাবে কাজ করে তবে আমি যখন অ্যাক্টিভিটি লগডইন এ থাকি এবং আমি অ্যাপ্লিকেশনটি ছোট করি এবং অ্যাপ্লিকেশন ড্রয়ারের লঞ্চার বোতামের আইকনে ক্লিক করি, মেইনএ্যাকটিভিটি আবার শুরু হয়: - / আমি পতাকাটি ব্যবহার করছি

android:LaunchMode:singleTask 

মেইনএ্যাকটিভিটির জন্য।


2

জন্য নিম্নলিখিত ব্যবহার করুন activity

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

CLEAR_TASK সরানখণ্ড ব্যবহারের জন্য পতাকা ।

আমি আশা করি এটি কিছু লোকের জন্য ব্যবহার করতে পারে।


1

শুধু রাখা

Intent intent = new Intent(ProfileActivity.this,
    LoginActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
startActivity(intent);

4
এটা কাজ করছে না. আমি এখনও ব্যাক বোতামটি ব্যবহার করে প্রোফাইলএকটিভিটিতে যেতে পারি
আর্কি.বিপিজিসি

1

অভিপ্রায়িত ফ্ল্যাগগুলির কোনওটিই আমার পক্ষে কাজ করেনি, তবে আমি এটি ঠিক করেছি:

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


1

এটি কাজ করবে এটি চেষ্টা করুন:

Intent logout_intent = new Intent(DashboardActivity.this, LoginActivity.class);
logout_intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
logout_intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
logout_intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
startActivity(logout_intent);
finish();

1

11 স্তরের বা ততোধিক স্তরে, সমস্ত ক্রিয়াকলাপের স্ট্যাক সাফ করতে ইন্টেন্টে ব্যবহার করুন FLAG_ACTIVITY_CLEAR_TASKএবং FLAG_ACTIVITY_NEW_TASKফ্ল্যাগ করুন।

Intent i = new Intent(OldActivity.this, NewActivity.class);
// set the new task and clear flags
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |  Intent.FLAG_ACTIVITY_CLEAR_TASK)
startActivity(i);

0

এটা ব্যবহার কর

Intent i1=new Intent(getApplicationContext(),StartUp_Page.class);
i1.setAction(Intent.ACTION_MAIN);
i1.addCategory(Intent.CATEGORY_HOME);
i1.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
i1.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
i1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(i1);
finish();

আপনি কি সেটফ্ল্যাগস এবং অ্যাডফ্লাগগুলি জানতেন?
জিভিশর্মা


0

উন্নত, পুনঃব্যবহারযোগ্য কোটলিন:

আপনি সেটার পদ্ধতিটি ব্যবহার করে সরাসরি পতাকাটি সেট করতে পারেন। Kotlin ইন orহয় প্রতিস্থাপন জাভা, bitwise বা |

intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK

আপনি যদি এটি নিয়মিত ব্যবহারের পরিকল্পনা করেন তবে একটি উদ্দেশ্য এক্সটেনশন ফাংশন তৈরি করুন

fun Intent.clearStack() {
    flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
}

এরপরে অভিপ্রায় শুরু করার আগে আপনি সরাসরি এই ফাংশনটিতে কল করতে পারেন

intent.clearStack()

আপনার যদি অন্যান্য পরিস্থিতিতে অতিরিক্ত পতাকা যুক্ত করার বিকল্পের প্রয়োজন হয় তবে এক্সটেনশন ফাংশনে একটি alচ্ছিক পরম যুক্ত করুন।

fun Intent.clearStack(additionalFlags: Int = 0) {
    flags = additionalFlags or Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.