অ্যান্ড্রয়েড: ক্রিয়াকলাপের স্ট্যাক


132

আমি আমার অ্যাপ্লিকেশনটিতে বেশ কয়েকটি ক্রিয়াকলাপ করছি। এবং প্রবাহ খুব জটিল। আমি যখন লগআউট অ্যাপ্লিকেশন ক্লিক করি তখন লগইন স্ক্রিন নেভিগেট করে এবং সেখান থেকে ব্যবহারকারী বাতিল বোতামটি (কলিং system.exit(0)) করে প্রস্থান করতে পারবেন

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

validateuser logoutuser = new validateuser();
logoutuser.logOut();
Intent loginscreen = new Intent(homepage.this, Login2.class);
(homepage.this).finish();
loginscreen.setFlags( Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NO_HISTORY);
startActivity(loginscreen);

1
এই লিঙ্কে ... পরীক্ষা stackoverflow.com/questions/5139686/exit-an-android-app/...
xydev

উত্তর:


339

আপনার বেশিরভাগই ভুল। আপনি যদি সেখানে বিদ্যমান কার্যকলাপ নির্বিশেষে বিদ্যমান ক্রিয়াকলাপ স্ট্যাকটি বন্ধ করতে এবং নতুন মূল তৈরি করতে চান তবে পতাকাগুলির সঠিক সেটটি নিম্নলিখিত:

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

ডক থেকে :

public static final int FLAG_ACTIVITY_CLEAR_TASK
এপিআই স্তরের ১১-এ যুক্ত হয়েছে

যদি কোনও উদ্দেশ্যে পাঠানো উদ্দেশ্যতে সেট করা থাকে তবে Context.startActivity()এই পতাকাটি ক্রিয়াকলাপ শুরু হওয়ার আগে এই ক্রিয়াকলাপের সাথে সম্পর্কিত যে কোনও বিদ্যমান কাজটি সাফ হয়ে যাওয়ার কারণ ঘটায়। এটি হ'ল, ক্রিয়াকলাপ অন্যথায় খালি কাজের নতুন মূল হয়ে যায় এবং কোনও পুরানো ক্রিয়াকলাপ শেষ হয়। এটি কেবলমাত্র একত্রে ব্যবহার করা যেতে পারে FLAG_ACTIVITY_NEW_TASK


নিখুঁতভাবে কাজ করেছেন। ধন্যবাদ। আশ্চর্যজনকভাবে minSDK = 9 দিয়ে ত্রুটি দেয় নি।
মাহমুদ

সত্যই আমি এই কার্যকারিতাটি কখনও ব্যবহার করি নি, ক্রাশের পরে পুনরুত্থান ইত্যাদি, এবং
ক্রাশের কারণগুলির সমাধানের দিকে মনোনিবেশ করেছি

একই কার্যকারিতাটি IntentCompat.makeRestartActivityTaskসমর্থন লাইব্রেরি থেকেও সরবরাহ করে ।
sealskej

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

1
অন্যতম সেরা সূচনা: "আপনারা বেশিরভাগই ভুল।"
নিব্বানা

31

আপনি startActivityসর্বশেষ ক্রিয়াকলাপটি কল করার সময় আপনি সর্বদা ব্যবহার করতে পারেন

Intent.FLAG_ACTIVITY_CLEAR_TOP

যে অভিপ্রায় একটি পতাকা হিসাবে।

এখানে পতাকা সম্পর্কে আরও পড়ুন ।


এটিও সাহায্য করে না। আমি সবেমাত্র একটি ক্রিয়াকলাপ এনেছি ডেট শেষ () দিয়ে শেষ হয় না; :(
জয় মায়ু

আমার ধারণা FLAG_ACTIVITY_CLEAR_TOP শীর্ষে থাকা ক্রিয়াকলাপগুলি সাফ করে। আমার সমস্যাটি নীচে থাকা ক্রিয়াকলাপগুলি :(
জয় মায়ু

আমার ধারণা এটি প্রবাহটি আসলে কেমন হয় তার উপর নির্ভর করে। আপনার এটি সম্পর্কে এখানে আরও পড়তে হবে: developer.android.com/references/android/content/… এবং developer.android.com/guide/topics/fundamentals/…
ডেভিড ওলসন

7
সঠিক সংস্থান দেখানোর জন্য ধন্যবাদ। আমি যে ভুলটি করেছি তা হ'ল লগইন ক্রিয়াকলাপ বন্ধ করে দেওয়া। আমার এটি বন্ধ করা উচিত নয়। যখন কার্যকলাপটি প্রথমে লোড হয় When সুতরাং আমি যখন ক্লিয়ার_টপ ফ্ল্যাগ ব্যবহার করে এটিকে কল করি তখন লগইন ক্রিয়াকলাপ উপরের সমস্ত ক্রিয়াকলাপ সাফ করে। যেহেতু লগইন প্রথম প্রবেশের ক্রিয়াকলাপ, তাই এটি শুরু হওয়া সমস্ত ক্রিয়াকলাপ সাফ করে। তাই বিঙ্গো এটি কাজ করেছে :)
জে মায়ু

13
ডকুমেন্টেশন থেকে, FLAG_ACTIVITY_CLEAR_TOP কেবল সুনির্দিষ্ট ক্রিয়াকলাপটি "বর্তমান কার্যক্রমে ইতিমধ্যে চলছে" কেবল তখনই স্ট্যাকটি সাফ করে
অ্যালিকেলজিন-কিলাকা

16

নতুন শীর্ষ ক্রিয়াকলাপ হিসাবে নতুন ক্রিয়াকলাপ শুরু করার জন্য এখানে একটি সহজ সহায়ক পদ্ধতি যা এপিআই স্তর 4 থেকে বর্তমান সংস্করণ 17 পর্যন্ত কাজ করে:

static void startNewMainActivity(Activity currentActivity, Class<? extends Activity> newTopActivityClass) {
    Intent intent = new Intent(currentActivity, newTopActivityClass);
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
        intent.addFlags(0x8000); // equal to Intent.FLAG_ACTIVITY_CLEAR_TASK which is only available from API level 11
    currentActivity.startActivity(intent);
}

আপনার বর্তমান ক্রিয়াকলাপ থেকে এটি কল করুন:

startNewMainActivity(this, MainActivity.class);

1
আপনি কেবলমাত্র ইন্টেন্ট.এডিডি ফ্ল্যাগস (0x8000) ব্যবহারের চেয়ে বেশি পারেন না; এবং যে সরল?
Davor

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

1
আপনি যখন এপিআই স্তরটি <11 হয় তখন আপনি পতাকাটি যুক্ত করতে চান তবে আপনার Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMBআর intent.addFlags(0x8000);কখনও করা হবে না
স্ট্র হ্যাট

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

9

নীচের কোডের মাধ্যমে ক্রিয়াকলাপের ব্যাকস্টেট সাফ করুন :

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

সম্পন্ন


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

@ রুচিরবারোনিয়া, আপনি যদি যান -> বি -> সি -> ডি -> ই -> এফ -> জি -> এইচ, এখন এইচ -> আপনি আমার কোডটি লিখেছেন তবে আমার শেষ কার্যকলাপ হবে তারপরে আপনি পিছনে বোতাম টিপুন অ্যাপ্লিকেশনটি বন্ধ হবে কারণ অ্যাপটির কোনও ব্যাকস্টেট ক্রিয়াকলাপ নেই, আশা করি এটি আপনাকে সহায়তা করবে।
হিরেন প্যাটেল

আমার যদিও এটি করা দরকার? আমি যদি কখনও ক্রিয়াকলাপের স্ট্যাকটি পরিষ্কার না করি তবে কী হবে?
রুচির বড়োনিয়া

@ রুচিরবারোনিয়া, ব্যাকপ্রেস: এইচ -> জি -> এফ -> ই -> ডি -> সি -> বি -> এ
হিরেন প্যাটেল

তবে কিছু সময় এটি নতুন ক্রিয়াকলাপের ডাকার সময় সাদা পর্দা দেখায়। এই সমাধান করতে হো?
সাগর

4

আমার ক্ষেত্রে লগইনঅ্যাক্টিভিটিও বন্ধ ছিল। ফলস্বরূপ,

Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK

সাহায্য না.

যাইহোক, সেটিং

Intent.FLAG_ACTIVITY_NEW_TASK

আমাকে সাহায্য করে ছিল.


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

3
Intent intent = new Intent(LoginActivity.this, Home.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);  //It is use to finish current activity
startActivity(intent);
this.finish();

1
আপনি কেন উভয় ব্যবহার করছেন this.finish()এবং setFlags()বর্তমান কার্যকলাপ সাফ করতে?
সাগর

3

আমি লক্ষ করেছি যে আপনি এমন একটি সমাধান চেয়েছিলেন যা নির্ভর করে না finish(), তবে আমি ভাবছি যে এটি যদি এখনও সহায়তা করে তবে।

আমি স্থিতিশীল শ্রেণীর চলক সহ একটি প্রস্থান পতাকা উত্থাপিত হয়েছে কিনা তা সনাক্ত করেছিলাম, যা পুরো অ্যাপ্লিকেশনটির আজীবন বেঁচে থাকে। প্রতিটি প্রাসঙ্গিক ক্রিয়াকলাপে onResume(), ব্যবহার করুন

@Override
public void onResume() {
    super.onResume();
    if (ExitHelper.isExitFlagRaised) {
        this.finish();
    }
}

এক্সিটহেল্পার ক্লাস

public class ExitHelper {
    public static boolean isExitFlagRaised = false;
}

আসুন মূল কার্যকলাপে বলি, একটি ব্যবহারকারী প্রস্থান করার জন্য একটি বোতাম টিপে - আপনি সেট করতে পারেন ExitHelper.isExitFlagRaised = true;এবং তারপরেও finish()। এরপরে, অন্যান্য প্রাসঙ্গিক ক্রিয়াকলাপগুলি যা স্বয়ংক্রিয়ভাবে পুনরায় শুরু হবে সেগুলিও শেষ হবে।


আমি যদি মেইনএকটিভিটি অন্রেসুমে () ব্যবহার করে কোডটি ব্যবহার করি তবে কী হবে যদি দ্বিতীয় ক্রিয়াকলাপের প্রতিক্রিয়া থেকে ফিরে ফিরে আসি
মিঠু

3

এই সিদ্ধান্ত ভাল কাজ করে:

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

তবে নতুন ক্রিয়াকলাপ দীর্ঘ হয় এবং আপনি কিছু সময় সাদা পর্দা দেখতে পান। এটি যদি সমালোচনা হয় তবে এই কার্যকারিতাটি ব্যবহার করুন:

public class BaseActivity extends AppCompatActivity {

    private static final String ACTION_FINISH = "action_finish";

    private BroadcastReceiver finisBroadcastReceiver;

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

        registerReceiver(finisBroadcastReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                finish();
            }
        }, new IntentFilter(ACTION_FINISH));
    }

    public void clearBackStack() {
        sendBroadcast(new Intent(ACTION_FINISH));
    }

    @Override
    protected void onDestroy() {
        unregisterReceiver(finisBroadcastReceiver);
        super.onDestroy();
    }
}

এটি কীভাবে ব্যবহার করবেন:

public class ActivityA extends BaseActivity {

    // Click any button
    public void startActivityB() {
        startActivity(new Intent(this, ActivityB.class));
        clearBackStack();
    }
}

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


2

জামারিন বিকাশকারীদের জন্য, আপনি এটি ব্যবহার করতে পারেন:

intent.SetFlags(ActivityFlags.NewTask | ActivityFlags.ClearTask);

1

কোটলিন ব্যবহার:

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

intent.flags = FLAG_ACTIVITY_NEW_TASK or FLAG_ACTIVITY_CLEAR_TASK

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

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

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

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