কীভাবে আগের ক্রিয়াকলাপে ফিরে যাওয়া রোধ করবেন?


210

যখন ফোনে ব্যাক বোতাম টিপছে তখন আমি একটি নির্দিষ্ট ক্রিয়াকলাপটিকে তার আগেরটিতে ফিরে আসতে বাধা দিতে চাই।

বিশেষত, আমার লগইন এবং সাইন আপ স্ক্রিন রয়েছে, HomeScreenসফল লগইন / সাইনআপ হওয়ার পরে উভয়ই একটি নতুন ক্রিয়াকলাপ শুরু করে । একবার হোমস্ক্রিন শুরু হয়ে গেলে, আমি ব্যবহারকারীদের ল্যাক-ইনটিতে ফিরে আসতে বা ব্যাক কী টিপলে পর্দার সাইন আপ করতে বাধা দিতে চাই।

আমি ব্যবহার করার চেষ্টা করেছি Intent.FLAG_ACTIVITY_NO_HISTORY, তবে যেহেতু অ্যাপ্লিকেশনটিতে ফেসবুকের সংহতকরণ রয়েছে, যখন 'ফেসবুক উইথ ফেসবুক' ব্যবহার করা হয়, ফেসবুকের উচিত প্রাথমিক লগইন স্ক্রিনে ফিরে আসা, সুতরাং এই ক্রিয়াকলাপগুলির একটি ইতিহাস আমার রাখা উচিত।

আমি HomeScreenযখন বোতামটি টিপানো হয় এবং আমি ব্যবহার করি তখন সরাসরি কোনও অ্যাপ্লিকেশন শেষ করতে BACK বোতামের আচরণকে ওভাররাইড করার কথা ভেবেছিলাম

@Override
public void onBackPressed() {
    finish();
}

কিন্তু এটিও কাজ করে না।


1
শুধু স্পষ্ট করে বলার জন্য, আপনি ফেসবুক ব্যতীত সবার জন্য আচরণের ব্যাক ক্যাপচার চেষ্টা করছেন?
havexz

2
কিছুটা অর্থে হ্যাঁ, তবে আসলে আমি যা চাই তা সফল লগইন হওয়ার পরে এবং হোমস্ক্রিন খুলার পরে, ব্যবহারকারীকে ব্যাক বোতাম টিপে লগইন স্ক্রিনে ফিরে যেতে সক্ষম হওয়া উচিত নয়। উদাহরণস্বরূপ টুইটার বা ফোরসোয়ারের মতো, একবার আমরা এই অ্যাপগুলিতে লগ ইন করি, আমরা লগইন না করা পর্যন্ত লগইন পৃষ্ঠাটি দেখতে পাই না (এমনকি লগ ইন করার পরে আমরা পিএইচসি চাপ দিলেও)।
Ecem

উত্তর:


345

আমার পরামর্শটি হ'ল সেই ক্রিয়াকলাপটি শেষ করা যা আপনি ব্যবহারকারীদের কাছে ফিরে যেতে চান না। উদাহরণস্বরূপ, আপনার সাইন ইন ক্রিয়াকলাপে, আপনি কল করার পরে startActivity, কল করুন finish()। ব্যবহারকারীরা যখন পিছনের বোতামটি চাপবে তখন তারা সাইন ইন ক্রিয়াকলাপে যেতে পারবে না কারণ এটি স্ট্যাকের বাইরে মারা গেছে।


2
আমি যদি পূর্ববর্তী ক্রিয়াকলাপের থ্রেডটি চালিয়ে যেতে চাই?
অ্যালিওপ

2
আপনি তখন আমার পদ্ধতির সাথে যেতে চাইবেন না। কলিং ফিনিস () ক্রিয়াকলাপটিকে হত্যা করবে। আপনি যে ক্রিয়াকলাপটিতে যাচ্ছেন তাতে আপনি যে প্রক্রিয়া চালাতে চান তা কি আপনার প্রক্রিয়া শুরু করতে পারেন?
কোডার

7
দ্রষ্টব্য: আপনি যদি finishএকটি ভাগ করা ট্রানজিশনের সময় কল করেন তবে আপনি আগের ক্রিয়াকলাপের মাধ্যমে রক্তপাত পেতে পারেন। যেমন, যদি আপনার HomeActivity-> IntermediateActivity-> FinalActivity, এবং আপনি কল finish()মধ্যে IntermediateActivityঅবিলম্বে শুরু করার পরে FinalActivityদেখা হবে HomeActivityএকটি সংক্ষিপ্ত মুহূর্ত জন্য।
ডেভিড মুরডোক

101

সাধারণ লগইন / মূল ক্রিয়াকলাপের দৃশ্যে বা একটি ব্লকিং স্ক্রিন বাস্তবায়নে নিম্নলিখিত সমাধানগুলি বেশ কার্যকর হতে পারে।

পূর্ববর্তী ক্রিয়াকলাপে ফিরে যাওয়ার চেয়ে অ্যাপ্লিকেশনটিকে ছোট করতে, আপনি onBackPressed()এই জাতীয় ওভাররাইড করতে পারেন :

@Override
public void onBackPressed() {
    moveTaskToBack(true);
}

moveTaskToBack(boolean nonRoot)আপনার পিছনের স্ট্যাকটি যেমন রয়েছে তেমন ছেড়ে দেয়, কেবল আপনার কার্য (সমস্ত ক্রিয়াকলাপ )টিকে পটভূমিতে রাখুন। একইভাবে যদি ব্যবহারকারীরা হোম বোতাম টিপায়

প্যারামিটার boolean nonRoot- যদি মিথ্যা হয় তবে এটি কেবল তখনই কাজ করে যদি কার্যকলাপ কোনও কাজের মূল হয়; সত্য হলে এটি কোনও কার্যক্রমে যে কোনও ক্রিয়াকলাপের জন্য কাজ করবে।


3
লগইন স্ক্রিনের জন্য উপযুক্ত কারণ এটি ইতিহাস অক্ষত রাখে।
হ্যাকমোডফোর্ড

আপনাকে ধন্যবাদ, আমি প্রায় তিন দিনের জন্য এটি সন্ধান করার চেষ্টা করেছি। অ্যান্ড্রয়েডের কারণে: নোহিসটরি = ক্রিয়াকলাপের জন্য "সত্য" পতাকাটি প্রত্যাশার মতো কাজ করে না (নো হিস্টরি পতাকাটি হ্রাস করার পরে ক্রিয়াকলাপটি পুনরায় তৈরি করে) এবং সমাপ্তি () কখনও কখনও আমার পক্ষে কাজ করে না, তবে কেন আমি এখনও বুঝতে পারি না।
ডেনশভ

37

আপনি ঠিক কী চান তা আমি নিশ্চিত নই, তবে এটি সম্ভব হওয়া উচিত বলে মনে হচ্ছে এবং আপনি ইতিমধ্যে সঠিক পথে আছেন বলেও মনে হচ্ছে।

এখানে কয়েকটি লিঙ্ক যা সহায়তা করতে পারে:

অ্যান্ড্রয়েডে ব্যাক বোতামটি অক্ষম করুন

  MyActivity.java =>
    @Override
    public void onBackPressed() {

       return;
    }

কিছু ক্রিয়াকলাপে আমি কীভাবে 'ফিরে যেতে' অক্ষম করতে পারি?

  AndroidManifest.xml =>
<activity android:name=".SplashActivity" android:noHistory="true"/>

1
ফেসবুক ইস্যুটির কারণে আমি নোহিসটরি বিকল্পটি ব্যবহার করতে পারি না যা আমি আমার প্রশ্নে এবং একটি মন্তব্যে ব্যাখ্যা করার চেষ্টা করেছি। তবে ব্যাক বোতামের সাহায্যে জিনিসটি অক্ষম করছে না, বরং এটি পুরো অ্যাপ্লিকেশনটিকে প্রস্থান করার মতো System.exit(0)বলে ডাকা হয় (আমি জানি এটি সেরা প্র্যাকটিভ নয়, তবে আমি কেবল একটি উদাহরণ দিতে চাই)।
Ecem

ধন্যবাদ এটি দুর্দান্ত কাজ করেছে। আমি এখানে কেবল পরামর্শই দেব, ফেরতের দরকার নেই return কেবল সুপার.নব্যাকপ্রেসড () সরান এবং পদ্ধতিটি ফাঁকা ছেড়ে দিন। এটি পাশাপাশি কাজ করে
হাইপোর কোডার

20

আপনার ক্ষেত্রে দুটি সমাধান রয়েছে, ক্রিয়াকলাপ এ ক্রিয়াকলাপ বি শুরু করে, তবে আপনি বি বিতে ক্রিয়াকলাপ A তে ফিরে আসতে চান না do

1. পিছনের স্ট্যাক থেকে পূর্ববর্তী ক্রিয়াকলাপটি এটিকে সরিয়ে ফেলা হয়েছে।

    Intent intent = new Intent(activityA.this, activityB.class);
    startActivity(intent);
    finish(); // Destroy activity A and not exist in Back stack

২. বি ক্রিয়াকলাপে ফিরে যাওয়া বোতামের ক্রিয়াটি অক্ষম করুন B.

নীচে যেমন ফিরে যাওয়ার ইভেন্ট রোধ করার দুটি উপায় রয়েছে,

1) পদ্ধতির প্রস্তাব

@Override
public void onBackPressed() {
}

2 on ওকেডাউন পদ্ধতিটি ওভাররাইড করুন

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if(keyCode==KeyEvent.KEYCODE_BACK) {
        return false;
    }
    return super.onKeyDown(keyCode, event);
}

আশা করি এটি কার্যকর, তবে এখনও আপনার পরিস্থিতির উপর নির্ভর করে।


3
অনব্যাকপ্রেসড () অক্ষম করা কি খারাপ ব্যবহারকারীর অভিজ্ঞতা নয়?
সি স্কাজারডাল

এটি সম্পূর্ণরূপে আপনি কী তৈরি করতে চাইছেন তার উপর নির্ভর করে, অ্যাপের কার্যকারিতাটিতে এর দরকার পরে এটির জন্য যান।
ব্যবহারকারী 3099225

আমি আশ্চর্যজনক যে কীভাবে আমি প্রথম পদ্ধতিটি ব্যবহার করে পুরোপুরি ভুলে গেছি finish()। অকারণে nohistoryঅ্যাট্রিবিউট, অভিপ্রায় পতাকা, প্যারেন্ট ক্রিয়াকলাপ ম্যানিফেস্ট ট্যাগ ইত্যাদির দ্বারা উত্সাহিত করা ! বোকা, উত্তরের জন্য ধন্যবাদ!
বরুণ

8

যেহেতু ইতিমধ্যে অনেক দুর্দান্ত সমাধানের পরামর্শ দেওয়া হয়েছে, অসুস্থরা আরও ডাইপিকটিভ ব্যাখ্যা দেওয়ার চেষ্টা করুন।

কিভাবে লাফালাফি পূর্ববর্তী কার্যকলাপের ফিরে যাচ্ছ?

ব্যাকস্ট্যাক থেকে পূর্ববর্তী ক্রিয়াকলাপ সরান। সহজ

কিভাবে ব্যাকস্ট্যাক থেকে পূর্বের ক্রিয়াকলাপ সরানো যায়?

কল finish()পদ্ধতি

সাধারণ প্রবাহ:

এখানে চিত্র বর্ণনা লিখুন
সমস্ত ক্রিয়াকলাপ ব্যাকস্ট্যাক নামে পরিচিত একটি স্ট্যাকে সঞ্চয় করা হয়।
আপনি যখন একটি নতুন ক্রিয়াকলাপ ( startActivity(...)) শুরু করেন তখন নতুন ক্রিয়াকলাপটিকে স্ট্যাকের শীর্ষে ঠেলে দেওয়া হয় এবং আপনি যখন পিছনের বোতাম টিপেন তখন কার্যকলাপটি স্ট্যাক থেকে পপ করা হয়।
একটি মূল বিষয় লক্ষণীয় হ'ল যখন পিছনের বোতামটি টিপানো হয় তখন finish();পদ্ধতিটিকে অভ্যন্তরীণ বলা হয়। এটি অনব্যাকপ্রেসড () পদ্ধতির ডিফল্ট আচরণ।

তাহলে আপনি যদি অ্যাক্টিভিটি বি বাদ দিতে চান?

যেমন এ <--- সি

ক্রিয়াকলাপ বি এর finish();পরে কেবল পদ্ধতি যুক্ত করুনstartActvity(...)

Intent i = new Intent(this, C.class);
startActivity(i);
finish();

এখানে চিত্র বর্ণনা লিখুন


6

finish()পুরো ক্রিয়াকলাপ নয় বরং বর্তমান ক্রিয়াকলাপ বন্ধ করার পদ্ধতি আপনাকে দেয়। এবং আপনি আরও ভাল অ্যাপ্লিকেশন হত্যার পদ্ধতি সন্ধান করার চেষ্টা করবেন না। সামান্য পরামর্শ।

আপনি একত্রিত করার চেষ্টা করেছেন Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS | Intent.FLAG_ACTIVITY_NO_HISTORY? Intentক্রিয়াকলাপ শুরু করার জন্য এই পতাকাগুলি ব্যবহার করতে ভুলবেন না !


2
FLAG_ACTIVITY_NO_HISTORYযখন ফেসবুকের সাথে লগইন ব্যবহার করা হয় তখন আমার লগইনস্ক্রিনটিকে ফেসবুকের কলব্যাক ক্যাপচার করতে বাধা দেয়। কারণ একবার ফোকাস লগইনস্ক্রিনের বাইরে চলে গেলে এটি পুনরায় চালু করা যায় না (যেহেতু কোনও ইতিহাস নেই)। তবে আমি এটি চেষ্টা করে Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTSদেখিনি, আমি এটি যাচাই করব, ধন্যবাদ!
Ecem

এছাড়াও finish()পদ্ধতি সম্পর্কে ধন্যবাদ , আমি এটি সম্পর্কে জানতাম না।
Ecem


3

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



3

এই পদ্ধতিটি ভাল কাজ করছে

Intent intent = new Intent(Profile.this, MainActivity.class); 
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
startActivity(intent);

2

স্রেফ onKeyDown পদ্ধতি ওভাররাইড করুন এবং পিছনের বোতামটি টিপছে কিনা তা পরীক্ষা করুন।

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) 
{
    if (keyCode == KeyEvent.KEYCODE_BACK) 
    {
        //Back buttons was pressed, do whatever logic you want
    }

    return false;
}

1
@Override
public void onBackPressed() {
}

আপনি যখন তৈরি করবেন তখন onBackPressed()সরিয়ে ফেলুন super.onBackPressed();এবং এটির কাজ করা উচিত


1

রাখুন

finish();

অ্যাক্টিভিস্টার্টের সাথে সাথে ক্রিয়াকলাপটি যাতে ফিরে যাওয়ার কোনও উপায় আটকাতে বন্ধ করে দেয়। তারপর যোগ

onCreate(){
    getActionBar().setDisplayHomeAsUpEnabled(false);
    ...
}

আপনি যে ক্রিয়াকলাপটি শুরু করছেন তাতে।

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