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


235

আমার অ্যাপ্লিকেশনটির সমস্ত ক্রিয়াকলাপ দেখার জন্য কোনও ব্যবহারকারীকে লগ-ইন থাকা দরকার। ব্যবহারকারীরা প্রায় কোনও কার্যকলাপ থেকে লগ আউট করতে পারেন। এটি আবেদনের প্রয়োজনীয়তা। ব্যবহারকারী যদি লগ-আউট করেন তবে আমি লগইনে ব্যবহারকারীকে প্রেরণ করতে চাই Activity। এই মুহুর্তে আমি চাই এই ক্রিয়াকলাপটি ইতিহাসের স্তরের নীচে থাকে যাতে "পিছনে" বোতাম টিপলে ব্যবহারকারী অ্যান্ড্রয়েডের হোম স্ক্রিনে ফিরে আসে।

আমি এই প্রশ্নটি কয়েকটি পৃথক স্থানে জিজ্ঞাসা করেছি, সমস্ত একইরকম উত্তর দিয়ে উত্তর দিয়েছে (যা আমি এখানে রূপরেখা দিয়েছি), তবে প্রতিক্রিয়া সংগ্রহ করার জন্য আমি এটি এখানে ভঙ্গ করতে চাই।

আমি লগইন ক্রিয়াকলাপটি তার Intentপতাকাগুলি সেট করে খোলার চেষ্টা করেছি FLAG_ACTIVITY_CLEAR_TOPযা ডকুমেন্টেশনে বর্ণিত হয়েছে বলে মনে হয়, তবে ইতিহাসের স্ট্যাকের নীচে লগইন ক্রিয়াকলাপটি রাখার এবং ব্যবহারকারীর পিছনে চলাচল করতে বাধা দেওয়ার আমার লক্ষ্য অর্জন করে না পূর্বে দেখা লগ ইন করা ক্রিয়াকলাপগুলিতে। আমি android:launchMode="singleTop"ম্যানিফেস্টে লগইন ক্রিয়াকলাপের জন্য ব্যবহার করার চেষ্টাও করেছি , তবে এটি আমার লক্ষ্যটিও অর্জন করে না (এবং যাইহোক কোনও প্রভাব নেই বলে মনে হয়)।

আমি বিশ্বাস করি আমাকে হয় ইতিহাসের স্ট্যাকটি সাফ করা বা পূর্বে খোলা সমস্ত ক্রিয়াকলাপ শেষ করতে হবে।

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

পরবর্তী বিকল্পটি হ'ল LinkedListসমস্ত উন্মুক্ত ক্রিয়াকলাপগুলির একটি রেফারেন্স বজায় রাখা যা সর্বত্র থেকে স্থিতিশীলভাবে অ্যাক্সেসযোগ্য (সম্ভবত দুর্বল রেফারেন্স ব্যবহার করে)। লগআউটে আমি এই তালিকাটি অ্যাক্সেস করব এবং অনুরোধ করে সমস্ত পূর্ববর্তী খোলার ক্রিয়াকলাপগুলিতে পুনরাবৃত্তি করবfinish() প্রত্যেকে পুনরায় । আমি সম্ভবত শীঘ্রই এই পদ্ধতিটি বাস্তবায়ন শুরু করব।

Intentতবে এটি সম্পাদন করার জন্য আমি কিছু পতাকা কৌশল ব্যবহার করব । আমি উপরে বর্ণিত দুটি পদ্ধতির যে কোনওটি ব্যবহার না করেই আমার আবেদনের প্রয়োজনীয়তা পূরণ করতে পেরে আমি খুশি হব।

Intentম্যানিফেস্ট সেটিংস ব্যবহার করে বা ম্যানিফেস্ট সেটিংস ব্যবহার করে এটি সম্পাদন করার কোনও উপায় আছে , বা আমার দ্বিতীয় বিকল্পটি, কোনও LinkedListখোলা ক্রিয়াকলাপ বজায় রাখা সর্বোত্তম বিকল্প? বা অন্য কোনও বিকল্প আছে যা আমি সম্পূর্ণরূপে উপেক্ষা করছি?

উত্তর:


213

আমি আপনাকে আরও দৃ approach়তর আইএমএইচও আরও শক্তিশালী করার পরামর্শ দিতে পারি। মূলত আপনার লগ-ইন অবস্থার অধীনে থাকা আপনার সমস্ত ক্রিয়াকলাপে আপনাকে একটি লগআউট বার্তা সম্প্রচার করতে হবে। সুতরাং আপনি আপনার সমস্ত অ্যাকটিভিটিতে sendBroadcastএকটি ব্যবহার করতে এবং ইনস্টল করতে পারেন BroadcastReceiver। এটার মতো কিছু:

/** on your logout method:**/
Intent broadcastIntent = new Intent();
broadcastIntent.setAction("com.package.ACTION_LOGOUT");
sendBroadcast(broadcastIntent);

রিসিভার (সুরক্ষিত কার্যকলাপ):

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    /**snip **/
    IntentFilter intentFilter = new IntentFilter();
    intentFilter.addAction("com.package.ACTION_LOGOUT");
    registerReceiver(new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            Log.d("onReceive","Logout in progress");
            //At this point you should start the login activity and finish this one
            finish();
        }
    }, intentFilter);
    //** snip **//
}

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

9
মেমরি পুনরুদ্ধারের জন্য স্ট্যাকের কোথাও কোনও ক্রিয়াকলাপ ওএস দ্বারা বন্ধ করে দিলে কি এটি কাজ করবে? অর্থাৎ। উপরের সম্প্রচারটি প্রেরণের পরে কি সিস্টেমটি এটি সত্যিই সমাপ্ত হবে এবং পিছনের বোতামটি আঘাত করে পুনরায় তৈরি করবে না?
জানু কনভস্কি

5
যদিও এটি একটি মার্জিত সমাধানের মতো মনে হচ্ছে, তবে এটি লক্ষণীয় যে এটি সমকালীন নয়।
চে জামি

34
একটি দুর্দান্ত সমাধান, তবে উপরের কোডটিতে বর্ণিত ব্রডকাস্ট রিসিভারটি ব্যবহার করার পরিবর্তে আপনার একটি লোকালড্রোডকাস্টম্যানেজ.আরগেইট ইনসট্যান্স (এটি) .registerReceiver (...) এবং লোকালব্রোডকাস্টম্যানেজআরটিআইনস্ট্যান্স (এটি) ব্যবহার করা উচিত। ।
উইন্ডোজ

5
@ ওয়ার্লক আপনি সঠিক আছেন এই পদ্ধতির অসুবিধা হ'ল যখন ব্যাক স্ট্যাকের কোনও ক্রিয়াকলাপ সিস্টেম দ্বারা ধ্বংস হয়ে যায় (বিভিন্ন কারণে ঘটতে পারে, যেমন স্বল্প স্বল্প স্মৃতি হিসাবে চিহ্নিত দৃশ্য)। সেক্ষেত্রে ক্রিয়াকলাপের উদাহরণটি সম্প্রচারটি পেতে পারে না। কিন্তু সিস্টেমটি পুনরায় পুনরায় তৈরি করে সেই ক্রিয়াকলাপটি পুনরায় নেভিগেট করবে। এটি "ক্রিয়াকলাপগুলি রাখবেন না" বিকাশকারী সেটিংস চালু করে পরীক্ষা করা / পুনরুত্পাদন করা যেতে পারে
এরিক শ্লেঞ্জ

151

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

প্রথমত, আমার গবেষণা অনুযায়ী এটি করার কোনও সুস্পষ্ট বা তাত্ক্ষণিক উপায় নেই (as of September 2012).আপনি ভাবেন যে আপনি সহজ করতে পারবেন startActivity(new Intent(this, LoginActivity.class), CLEAR_STACK)তবে না

আপনি কি করতে পারেন startActivity(new Intent(this, LoginActivity.class))সঙ্গে FLAG_ACTIVITY_CLEAR_TOP- এবং এই স্ট্যাকের নিচে অনুসন্ধান, LoginActivity আপনার আগের মূল উদাহরণ সন্ধান করুন, এটা পুনঃ এবং (ঊর্ধ্বমুখী) স্ট্যাক বাকি পরিষ্কার ফ্রেমওয়ার্ক কারণ হবে। এবং যেহেতু লগইন সম্ভবত স্ট্যাকের নীচে রয়েছে, আপনার এখন একটি খালি স্ট্যাক রয়েছে এবং পিছনের বোতামটি কেবল অ্যাপ্লিকেশনটি থেকে প্রস্থান করবে।

বাট - এটি কেবল তখনই কাজ করে যদি আপনি লগইনঅ্যাক্টিভিটির সেই আসল উদাহরণটি আপনার স্ট্যাকের গোড়ায় বেঁচে রেখেছেন। যদি অনেক প্রোগ্রামারদের মতো, আপনি বেছে finish()যে LoginActivityএকবার ব্যবহারকারী সফলভাবে লগ ইন করেছেন তারপর, এটা স্ট্যাকের বেস উপর আর এবং FLAG_ACTIVITY_CLEAR_TOPশব্দার্থবিদ্যা প্রযোজ্য হবে না ... যদি আপনি একটি নতুন তৈরি শেষ LoginActivityবিদ্যমান স্ট্যাকের উপর। যা প্রায় নিশ্চিতভাবেই আপনি চান না (ব্যবহারকারীরা কোনও পূর্ববর্তী স্ক্রিনে লগইন করার পথটি 'পিছনে' দিতে পারে এমন এক অদ্ভুত আচরণ)।

সুতরাং আপনার যদি আগে finish()'ডি' থাকে LoginActivityতবে আপনার স্ট্যাক সাফ করার জন্য এবং তারপরে একটি নতুন শুরু করার জন্য আপনাকে কিছু পদ্ধতি অনুসরণ করতে হবে LoginActivity। দেখে মনে হচ্ছে @doreamonএই থ্রেডের উত্তর হ'ল উত্তম সমাধান (কমপক্ষে আমার নম্র চোখে):

https://stackoverflow.com/a/9580057/614880

আমি দৃ strongly়ভাবে সন্দেহ করি যে আপনি লগইনঅ্যাক্টিভিটি জীবিত রেখেছেন কিনা এর জটিল কৌশলগুলি এই বিভ্রান্তির কারণ ঘটাচ্ছে।

শুভকামনা


5
ভাল উত্তর. FLAG_ACTIVITY_CLEAR_TOP কৌতুক, যা বেশিরভাগ লোকেরা ব্যবহার করার পরামর্শ দেয়, আপনি যদি লগইনঅ্যাক্টিভিটি শেষ করে থাকেন তবে তা কার্যকর হয় না।
কনসুমিয়ারার

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

118

হালনাগাদ

সুপার finishAffinity()পদ্ধতিটি হ্রাস করতে সহায়তা করবে তবে একইটি অর্জন করবে। এটি বর্তমান ক্রিয়াকলাপের পাশাপাশি স্ট্যাকের সমস্ত ক্রিয়াকলাপ শেষ করবে, getActivity().finishAffinity()আপনি যদি খণ্ডে থাকেন তবে ব্যবহার করুন ।

finishAffinity(); 
startActivity(new Intent(mActivity, LoginActivity.class));

মূল উত্তর

ধরে নিন যে লগইনঅ্যাক্টিভিটি -> হোমঅ্যাক্টিভিটি -> ... -> সেটিংসঅ্যাক্টিভিটি কল সাইনআউট ():

void signOut() {
    Intent intent = new Intent(this, HomeActivity.class);
    intent.putExtra("finish", true);
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); // To clean up all activities
    startActivity(intent);
    finish();
}

HomeActivity:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    boolean finish = getIntent().getBooleanExtra("finish", false);
    if (finish) {
        startActivity(new Intent(mContext, LoginActivity.class));
        finish();
        return;
    }
    initializeView();
}

এটি আমার পক্ষে কাজ করে, আশা করি এটি আপনার পক্ষেও সহায়ক। :)


1
আমি মনে করি আপনার সমাধান ধরে নিয়েছে যে ব্যবহারকারী সাইনআউটে ক্লিক করবে এবং কেবল একটি ক্রিয়াকলাপে (হোমঅ্যাক্টিভিটি) ফিরে যাবে। যদি আপনার স্ট্যাকের 10 টি ক্রিয়াকলাপ থাকে?
ইগোরগানাপলস্কি

11
আপনার যদি হোমঅ্যাক্টিভিটির শীর্ষে 10 টি ক্রিয়াকলাপ থাকে তবে FLAG_ACTIVITY_CLEAR_TOP পতাকা তাদের সমস্তটি পরিষ্কার করতে সহায়তা করবে।
Thanhbinh84

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

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

2
ইনটেন্ট.এফএলজি_এসিটিভিটি_স্লেয়ার_টপ পতাকা হোমঅ্যাক্টিভিটি সহ সমস্ত ক্রিয়াকলাপ পরিষ্কার করতে সহায়তা করে, সুতরাং আপনি যখন আবার এই ক্রিয়াকলাপটি শুরু করবেন তখন অনক্রিট () পদ্ধতিটি কল হবে।
Thanhbinh84

73

আপনি যদি 11 বা FLAG_ACTIVITY_CLEAR_TASKততোধিক এপিআই ব্যবহার করে থাকেন তবে আপনি এটি ব্যবহার করে দেখতে পারেন: - মনে হচ্ছে এটি আপনার ঠিক সমস্যাটি সমাধান করছে। স্পষ্টতই, প্রাক-এপিআই 11 ১১ জন ভিড়কে সমস্ত ক্রিয়াকলাপের অতিরিক্ত কিছু পরীক্ষা করার কিছু সংমিশ্রণ ব্যবহার করতে হবে, যেমন @ ডোরেমন পরামর্শ দেয় বা অন্য কোনও কৌশল trick

(আরও মনে রাখবেন: এটি ব্যবহার করতে আপনাকে প্রবেশ করতে হবে FLAG_ACTIVITY_NEW_TASK)

Intent intent = new Intent(this, LoginActivity.class);
intent.putExtra("finish", true); // if you are checking for this in your other Activities
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | 
                Intent.FLAG_ACTIVITY_CLEAR_TASK |
                Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
finish();

1
কবজির মতো কাজ করা। আপনাকে অনেক ধন্যবাদ! আমি নূন্যতম এপিআই 14 তে বিকাশ করার সাথে সাথে এটি প্রয়োগ করার একমাত্র জিনিস।
অ্যান্ডি

1
আমি মনে করি লগইনঅ্যাক্টিভিটির জন্য এই সমাধানটি ব্যবহার করার সময় আমাদের FLAG_ACTIVITY_CLEAR_TOP দরকার নেই।
ভারত দোদেজা

আমি মনে করি finish();লগআউট করার পরে ফিরে যাওয়া রোধ করতে কেবল কাজটি করবে। পতাকা লাগানোর দরকার কী?
পঙ্কজ

এটি কার্যকলাপ ব্যতিক্রমের বাইরে থেকে কলিং স্টার্টিটি () কলিংয়ের জন্য একটি ব্যতিক্রম তৈরি করে যাতে FLAG_ACTIVITY_NEW_TASK পতাকা প্রয়োজন
আমান

31

আমি এটিতেও কয়েক ঘন্টা ব্যয় করেছি ... এবং সম্মত হলাম যে FLAG_ACTIVITY_CLEAR_TOP আপনি যা চান তা মনে হচ্ছে: ক্রিয়াকলাপটি চালু করা ছাড়া পুরো স্ট্যাকটি সাফ করুন, সুতরাং পিছনের বোতামটি অ্যাপ্লিকেশনটি থেকে প্রস্থান করে। তবুও মাইক রেপাস যেমন উল্লেখ করেছেন, FLAG_ACTIVITY_CLEAR_TOP কেবল তখনই কাজ করে যখন আপনি যে কার্যকলাপটি চালু করছেন তা ইতিমধ্যে স্ট্যাকের মধ্যে রয়েছে; ক্রিয়াকলাপটি সেখানে না থাকলে পতাকাটি কিছুই করে না।

কি করো? এফএলজি_এসিটিভিটি_এনইউউডিওয়াসক দিয়ে স্ট্যাকটিতে যে ক্রিয়াকলাপটি চালু হচ্ছে তা রাখুন , যা সেই ক্রিয়াকলাপটিকে ইতিহাস স্ট্যাকের উপর একটি নতুন টাস্কের সূচনা করে। তারপরে FLAG_ACTIVITY_CLEAR_TOP পতাকা যুক্ত করুন।

এখন, যখন FLAG_ACTIVITY_CLEAR_TOP স্ট্যাকের মধ্যে নতুন ক্রিয়াকলাপটি সন্ধান করতে যায়, তখন সেখানে উপস্থিত থাকবে এবং সমস্ত কিছু সাফ হওয়ার আগে এটি টেনে নেওয়া হবে।

এখানে আমার লগআউট ফাংশন; ভিউ প্যারামিটার হ'ল বোতামটি যাতে ফাংশনটি সংযুক্ত থাকে।

public void onLogoutClick(final View view) {
    Intent i = new Intent(this, Splash.class);
    i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
    startActivity(i);
    finish();
}

1
FLAG_ACTIVITY_CLEAR_TASKএখনও যোগ করা হয়নি হিসাবে
<<

1
@ ক্রিসটিনাক আপনি FLAG_ACTIVITY_CLEAR_TOP এর কথা বলছেন এবং আপনার কোড স্নিপেটে FLAG_ACTIVITY_CLEAR_TASK রয়েছে; তাহলে কোনটি বৈধ?
মেরিয়ান প্যাডজিওচ

10

প্রচুর উত্তর। এটি হতে পারে এটিও সাহায্য করবে-

Intent intent = new Intent(activity, SignInActivity.class)
                .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK)
                .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
this.startActivity(intent);
this.finish();

কোটলিন সংস্করণ-

Intent(this, SignInActivity::class.java).apply {
    addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK)
    addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
}.also { startActivity(it) }
finish()

4

এটি আপনার জন্য সহায়ক হতে হবে ব্যবহার করুন। সামান্য পরিবর্তিত xbakesx উত্তর।

Intent intent = new Intent(this, LoginActivity.class);
if(Build.VERSION.SDK_INT >= 11) {
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK);
} else {
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
}
startActivity(intent);

4

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

protected void onResume() {
  super.onResume();
  if (isAuthRequired()) {
    checkAuthStatus();
  }
}

private void checkAuthStatus() {
  //check your shared pref value for login in this method
  if (checkIfSharedPrefLoginValueIsTrue()) {
    finish();
  }
}

boolean isAuthRequired() {
  return true;
}

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

2
আরও সম্ভবত আপনার মেথোডে চেকআউথস্ট্যাটাস রাখা উচিত onResume()। কারণ আপনি যখন পিছনের বোতামটি টিপেন তখন ক্রিয়াকলাপটি তৈরির পরিবর্তে পুনরায় শুরু হওয়ার সম্ভাবনা বেশি।
maysi

1
@ মাইসি পরামর্শের জন্য ধন্যবাদ, হ্যাঁ এইভাবে ফিরে আসা বোতামটিও সঠিকভাবে কাজ করবে, আমি এন্ট্রি আপডেট করেছি
ইয়েকমার সিমসেক

4

কিছু সময় finish()কাজ হচ্ছে না

আমি এই বিষয়টি দিয়ে সমাধান করেছি

finishAffinity()


3

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

@Override
public void onBackPressed() {
    // disable going back to the MainActivity
    moveTaskToBack(true);
}

আমি ধরে নিচ্ছি যে ব্যবহারকারী লগ ইন করার ঠিক পরে লগইনঅ্যাক্টিভিটি শেষ হয়ে গেছে, যাতে পিছনের বোতামটি টিপে তিনি পরে এটিতে ফিরে যেতে না পারেন। পরিবর্তে, ব্যবহারকারীকে অবশ্যই সঠিকভাবে লগ আউট করতে অ্যাপের ভিতরে একটি লগ আউট বোতাম টিপতে হবে। এই লগ আউট বোতামটি কার্যকর করবে তা হ'ল একটি সাধারণ উদ্দেশ্য:

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

সমস্ত পরামর্শ স্বাগত।


2

নির্বাচিত উত্তরটি চতুর এবং কৌশলযুক্ত। আমি এটি কীভাবে করেছি তা এখানে:

লগইনঅ্যাক্টিভিটি হ'ল টাস্কের মূল ক্রিয়াকলাপ, অ্যান্ড্রয়েড সেট করুন : ম্যানিফেস্ট.এক্সএমএলে এটির জন্য "সত্য" ; বলুন আপনি সেটিংসএকটিভিটি থেকে লগআউট করতে চান, আপনি নীচের মতো এটি করতে পারেন:

    Intent i = new Intent(SettingsActivity.this, LoginActivity.class);
    i.addFlags(IntentCompat.FLAG_ACTIVITY_CLEAR_TASK
            | Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(i);

2

সমাধানটি আমি এখানে আমার অ্যাপটিতে নিয়ে এসেছি।

আমার লগইনঅ্যাক্টিভিটিতে, সফলভাবে কোনও লগইন প্রক্রিয়া করার পরে, আমি পরবর্তীটি এপিআই স্তরের উপর নির্ভর করে শুরু করি।

Intent i = new Intent(this, MainActivity.class);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
    startActivity(i);
    finish();
} else {
    startActivityForResult(i, REQUEST_LOGIN_GINGERBREAD);
}

তারপরে আমার লগইনঅ্যাক্টিভিটিরঅ্যাক্টিভিটি ফর রিসাল্ট পদ্ধতিতে:

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB &&
        requestCode == REQUEST_LOGIN_GINGERBREAD &&
        resultCode == Activity.RESULT_CANCELED) {
    moveTaskToBack(true);
}

অবশেষে, অন্য কোনও ক্রিয়াকলাপে লগআউট প্রক্রিয়া করার পরে:

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

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


এটা আমার জন্য কাজ করে না। আমার ক্ষেত্রে আমি ফ্র্যাগমেন্টেটিভিটি ব্যবহার করেছি। Onactivityresult পদ্ধতি বলা হয় না।
মোহাম্মদ ইব্রাহিম

1

এটি আমার পক্ষে কাজ করেছে:

     // After logout redirect user to Loing Activity
    Intent i = new Intent(_context, MainActivity.class);
    // Closing all the Activities
    i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);

    // Add new Flag to start new Activity
    i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

    // Staring Login Activity
    _context.startActivity(i);

আপনি যে উত্তরটি সরবরাহ করেন সে সম্পর্কে আরও কিছু বিবরণ যুক্ত করে আরও উত্তর দিতে পারেন?
অ্যারিসোন

0

স্টার্টঅ্যাক্টিভিটি ফর রিসাল্ট দিয়ে আপনার কার্যকলাপ শুরু করুন এবং লগআউট করার সময় আপনার ফলাফলটি সেট করুন এবং ফলাফল অনুসারে আপনার ক্রিয়াকলাপ শেষ করুন

intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivityForResult(intent, BACK_SCREEN);

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    switch (requestCode) {
    case BACK_SCREEN:
        if (resultCode == REFRESH) {
            setResult(REFRESH);
            finish();
        }
        break;
    }
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK) {
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        AlertDialog alertDialog = builder.create();

        alertDialog
                .setTitle((String) getResources().getText(R.string.home));
        alertDialog.setMessage((String) getResources().getText(
                R.string.gotoHome));
        alertDialog.setButton(DialogInterface.BUTTON_POSITIVE, "Yes",
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog,
                            int whichButton) {

                        setResult(REFRESH);
                        finish();
                    }

                });

        alertDialog.setButton(DialogInterface.BUTTON_NEGATIVE, "No",
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog,
                            int whichButton) {
                    }
                });
        alertDialog.show();
        return true;
    } else
        return super.onKeyDown(keyCode, event);

}

0

@ ডোরেয়ামন প্রদত্ত সমাধানটি একটি ব্যতীত অন্য সকল ক্ষেত্রে সার্থক কাজ করে:

লগইন করার পরে, লগইন স্ক্রিন ব্যবহারকারী কিলিং মিডিল স্ক্রিনে সরাসরি নেভিগেট করেছে। উদাহরণস্বরূপ A-> B-> C এর প্রবাহে, নেভিগেট করুন: লগইন -> বি -> সি -> ঘরে শর্টকাট টিপুন। FLAG_ACTIVITY_CLEAR_TOP ব্যবহার করা কেবল সি ক্রিয়াকলাপ সাফ করে, কেননা হোম (এ) স্ট্যাকের ইতিহাসে নেই। একটি স্ক্রিনে পিছনে চাপলে আমাদের ফিরে যাবে বিতে to

এই সমস্যাটি মোকাবেলা করার জন্য, আমরা একটি ক্রিয়াকলাপের স্ট্যাক (অ্যারেলিস্ট) রাখতে পারি এবং যখন বাড়ির উপর চাপ দেওয়া হয়, তখন এই স্ট্যাকের সমস্ত ক্রিয়াকলাপ আমাদের মেরে ফেলতে হবে।


0

SharedPreferences বা অ্যাপ্লিকেশন ক্রিয়াকলাপে একটি পতাকা পরিচালনা করে এটি সম্ভব।

অ্যাপ্লিকেশন শুরু করার সময় (স্প্ল্যাশ স্ক্রিনে) পতাকাটি সেট করুন = মিথ্যা; লগআউট ক্লিক ইভেন্টে পতাকাটি সত্য করে এবং প্রতিটি ক্রিয়াকলাপের অনার্সিউম () এ সেট করুন, পতাকাটি সত্য কিনা তা পরীক্ষা করে কল করুন ()।

এটি যাদুমন্ত্রের মত কাজ করে :)


0

লগআউট ক্লিকের উপর আপনি এই কল করতে পারেন

private void GoToPreviousActivity() {
    setResult(REQUEST_CODE_LOGOUT);
    this.finish();
}

পূর্ববর্তী ক্রিয়াকলাপের onActivityResult () আপনি সমস্ত কার্যক্রম শেষ না করা পর্যন্ত এই উপরের কোডটিকে আবার কল করুন again


1
এর অর্থ এটি একবারে সমাপ্তি () সমস্ত সম্প্রচারের পরিবর্তে সমস্ত ক্রিয়াকলাপকে রৈখিকভাবে অতিক্রম করতে হবে?
ইগোরগানাপলস্কি

@ ইগর জি। হ্যাঁ এটি যথাযথভাবে শেষ করার বিকল্প উপায়
মাক

-1

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

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

আর একটি জিনিস যা আপনি করতে পারেন তা হ'ল অনেসুমে () এর লগইন স্থিতি চেক করুন এবং লগ ইন না হলে সমাপ্ত () এবং লগইন ক্রিয়াকলাপ চালু করুন।


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

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