অ্যান্ড্রয়েড: স্ট্যাকের মধ্যে সংরক্ষণ না করে খোলা কার্যকলাপ activity


94

আমার 2 টি ক্রিয়াকলাপ রয়েছে: প্রধান এবং তালিকা।

মেইন থেকে আপনি তালিকা খুলতে পারেন; তালিকা থেকে আপনি মেইন খুলতে পারেন।

আমি এটি পছন্দ করি যাতে তালিকার প্রতিটি খোলার ইতিহাসে রক্ষা না পায়। সুতরাং, মেইন থেকে পিছনে চাপলে তালিকায় ফিরে আসতে পারে না ।

এটা কি সম্ভব?


11
যদি 'তালিকা' শুরু 'প্রধান' তারপর আছে সেটিতে কল finish()পরে অবিলম্বে startActivity(...)। যদি ব্যবহারকারী 'প্রধান' থেকে BACK টিপেন তবে সেখানে ফিরে যাওয়ার কিছুই থাকবে না।
— স্কোঙ্ক

এটি বিজ্ঞপ্তি নেভিগেশনের জন্য তবে ধারণাগুলি প্রযোজ্য বিকাশকারী
— কেভিন লি

উত্তর:


160

আপনার তালিকার শুরু Activityকরার সময় এর Intentপতাকাগুলি এর মতো সেট করুন :

Intent i = new Intent(...); // Your list's Intent
i.setFlags(i.getFlags() | Intent.FLAG_ACTIVITY_NO_HISTORY); // Adds the FLAG_ACTIVITY_NO_HISTORY flag
startActivity(i);

FLAG_ACTIVITY_NO_HISTORYপতাকা নতুন রাখে Activityইতিহাস স্ট্যাক যোগ করা হচ্ছে না।

এনবি: @ স্যাম যেমন উল্লেখ করেছে, আপনি এর i.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);পরিবর্তে ব্যবহার করতে পারেন । কার্যকরী কোনও পার্থক্য নেই।


4
এই পদ্ধতিতে কেবলমাত্র একটি সামান্য মন্তব্য: কেবলমাত্র 2 টি ক্রিয়াকলাপ থাকলে এইটি পুরোপুরি কাজ করবে। তবে যদি তালিকা ক্রিয়াকলাপটি অন্য ক্রিয়াকলাপটি চালু করতে সক্ষম হয় (তৃতীয় ক্রিয়াকলাপটি বলুক), তৃতীয় ক্রিয়াকলাপের পিছনের বোতামটিতে একটি প্রেস মূল
— ক্রিয়ায়

প্রকৃতপক্ষে. দুর্ভাগ্যক্রমে, এড়ানো কোনও উপায় নেই। এমন কোনও Intentপতাকা নেই যা জানিয়েছে " Activityউত্সের দিকে ফিরে না আসলে কেবল ইতিহাসে যুক্ত হয় "।
— এরিক

4
না তবে FLAG_ACTIVITY_NEW_TASK পতাকাটি কাজ করবে, তালিকার ক্রিয়াকলাপ ইতিহাসে যুক্ত হবে তবে সর্বদা শীর্ষে থাকবে, তাই মূল ক্রিয়াকলাপ থেকে একটি ব্যাক প্রেস তালিকার ক্রিয়াকলাপটি প্রদর্শন করবে না
— ভিন্সএফআর

7
এর পরিবর্তে আপনি কোন বিশেষ কারণ ব্যবহার setFlags()করেছেন ? getFlags()Intent.addFlags()
— স্যাম

4
@ ভিনসএফআর এটি ঠিক আমার যা চাই! a -> খ -> গ এবং সরাসরি সি-
— রিয়েলটিবো

90

ম্যানিফেস্ট ফাইলটিতে যুক্ত করুন:

android:noHistory="true" 

আপনি যে স্ট্যাকটি রাখতে চান না সেই ক্রিয়াকলাপে।


পতাকা নং-ইতিহাসের সাথে ক্রিয়াকলাপ শুরু করা থেকে কোনও পার্থক্য রয়েছে?
— রিয়েলটিবো

4
যেমন আপনি আপনার প্রশ্নে বলেছেন "তালিকার প্রতিটি খোলার পরেও ইতিহাসে রক্ষা পাওয়া যায় না" অতএব আপনি যখনই আবার আবেদনটি খোলেন এটি আপনাকে মূল
— ক্রিয়ায়

@ মার্সিনস অ্যাপ্লিকেশন যখন সাম্প্রতিক অ্যাপ্লিকেশন তালিকায় নেই তখন এটি কাজ করে না। কেন এটি হচ্ছে তা সম্পর্কে দয়া করে ব্যাখ্যা করতে পারেন
— অজিত কুমার দুবে

4
তাহলে এই 2 পদ্ধতির (মেনিফেস্ট এবং পতাকা) মধ্যে পার্থক্য কী?
— পুম্বোশা

@ পুম্বোশা ম্যানিফেস্ট পদ্ধতির ক্রিয়াকলাপটি সর্বদা ইতিহাসের বাইরে চলে যাবে। ফ্ল্যাগ অ্যাপ্রোচ আপনাকে রানটাইম সময়ে সেই আচরণটি নিয়ন্ত্রণ করতে দেয়।
— জন ক্র্যাফোর্ড

28

ক্লিয়ারিংয়ের সাথে নতুন টাস্কটি ব্যবহার করুন। এটি অন্যান্য ক্ষেত্রে যখন অপশন না করায় এটি আমার ক্ষেত্রে কাজ করেছিল।

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

পুরো ইতিহাসের স্ট্যাক সাফ করুন এবং অ্যান্ড্রয়েডে একটি নতুন ক্রিয়াকলাপ শুরু করুন


4
এটি দুর্দান্ত হবে তবে সিস্টেমের ঝাড়ু "চেঞ্জিং টাস্ক" অ্যানিমেশন বন্ধ করার কোনও উপায় আছে কি? দুর্ভাগ্যক্রমে FLAG_ACTIVITY_NO_ANIMATION যোগ করা এটি প্রতিরোধ করে না!
— androidguy

এই অ্যাপ্লিকেশন গতি উপর প্রভাব ফেলবে?
— অ্যাকো পিটটা

23

দেখে মনে হচ্ছে, আপনি অন্যটি খোলার ঠিক পরে যদি আপনার ক্রিয়াকলাপে ফিনিশ () কল করেন, তবে যেটি শেষ হয়েছে তাকে স্ট্যাক থেকে সরানো হবে।

উদাহরণ স্বরূপ:

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

যদি আপনার ফোনটি এত দ্রুত না হয় আপনি আগের ক্রিয়াকলাপটি বন্ধ হয়ে যাচ্ছেন বলে আপনি দেখতে পাবেন।
— নোলান

@ নোলান কেবল তখনই আপনি কার্যকলাপ শুরু করার আগে শেষ করেন
— হেনরিক বগেলুন্ড লাভস্টেন

7

আমার বিশেষ ক্ষেত্রে FLAG_ACTIVITY_NO_HISTORYকাজ হয়নি। আমরাও করেনি FLAG_ACTIVITY_NEW_TASKবা FLAG_ACTIVITY_CLEAR_TASKএকা নিজেদের কাজের দ্বারা।

তবে FLAG_ACTIVITY_NEW_TASKএবং FLAG_ACTIVITY_CLEAR_TASKএকসাথে কাজ করেছেন।

Intent intent = new Intent(FooActivity.this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);

4

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

বিকল্প 1 - ঠিক এই এক ক্রিয়াকলাপে কলিং ক্রিয়াকলাপের ইতিহাস থাকা উচিত নয়

তারপরে কেবল করুন:

Intent i = new Intent(...);
i.addFlag(Intent.FLAG_ACTIVITY_NO_HISTORY);
startActivity(i);

বিকল্প 2 - নির্দিষ্ট ক্রিয়াকলাপ থেকে শুরু করা সমস্ত ক্রিয়াকলাপের ইতিহাস থাকা উচিত নয়

তারপরে কলিং ক্রিয়াকলাপটি প্রকাশ করুন:

android:noHistory="true" 

তবে আপনি যদি নতুন ক্রিয়াকলাপে ইতিহাস পেতে চান তবে আপনাকে নিজে হাতে পতাকাটি সরিয়ে ফেলতে হবে:

Intent i = new Intent(...);
i.removeFlag(Intent.FLAG_ACTIVITY_NO_HISTORY);
startActivity(i);

আশা করি যা অন্যান্য উত্তরগুলি সাফ করবে :)


3

কোটলিনে এটি করার জন্য কেবল একটি উপায় যুক্ত করতে চেয়েছিলেন:

val i = Intent(this, LogInActivity::class.java)
startActivity(i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK))

4
কোটলিন পথের আরও কিছু: Intent(this, MainActivity::class.java).apply { addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK) }.also { startActivity(it) }
— 4ndro1d

2

যদি ক্রিয়াকলাপ ইতিমধ্যে চলমান থাকে তবে FLAG_ACTIVITY_CLEAR_TOP চেষ্টা করুন:

Intent intent = new Intent(this, MyActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);


-4

'ফিরে' কার্যকারিতা বন্ধ করতে আপনি কি বিশেষ ক্রিয়াকলাপের পিছনের বোতামটি ওভাররাইড করতে পারবেন না?

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK) {

        return true;
    }
    return super.onKeyDown(keyCode, event);
}

6
এটি করবেন না। সুনির্দিষ্ট উদ্দেশ্যে ব্যাককে আটকানো গ্রহণযোগ্য, তবে নীরবে ব্যাক প্রেসটি গ্রাস করা এবং এটির সমাপ্তি রোধ করা Activityভাল অভ্যাস নয়।
— স্কোঁঙ্ক

4
সম্পূর্ণরূপে সম্মত হন - কেবল একটি বিকল্প।
— ভাঙ্গা

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