অ্যান্ড্রয়েড: স্ট্যাকের মধ্যে সংরক্ষণ না করে খোলা কার্যকলাপ 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.