অ্যান্ড্রয়েড - কীভাবে "পিছনে" বোতামটি ওভাররাইড করবেন যাতে এটি আমার ক্রিয়াকলাপ শেষ করে না?


199

আমার বর্তমানে একটি ক্রিয়াকলাপ রয়েছে যা এটি প্রকাশিত হয়ে গেলে বিজ্ঞপ্তি বারে প্রদর্শিত হবে।

এটি এমন হয় যাতে যখন ব্যবহারকারী বাড়ির চাপ দেয় এবং কার্যকলাপটি পটভূমিতে ধাক্কা দেয় তারা বিজ্ঞপ্তির মাধ্যমে ক্রিয়ায় ফিরে যেতে পারেন।

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

তাই মূলত আমি পিছনের বোতামটি হোম বোতামের মতোই একই রকম আচরণ করতে চাই এবং আমি এখন পর্যন্ত কীভাবে চেষ্টা করেছি তা এখানে:


        @Override
        public boolean onKeyDown(int keyCode, KeyEvent event)  {
            if (Integer.parseInt(android.os.Build.VERSION.SDK) < 5
                    && keyCode == KeyEvent.KEYCODE_BACK
                    && event.getRepeatCount() == 0) {
                Log.d("CDA", "onKeyDown Called");
                onBackPressed();
            }

            return super.onKeyDown(keyCode, event);
        }

        public void onBackPressed() {
            Log.d("CDA", "onBackPressed Called");
            Intent setIntent = new Intent(Intent.ACTION_MAIN);
            setIntent.addCategory(Intent.CATEGORY_HOME);
            setIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(setIntent); 

            return;
        }   

তবে উপরের কোডটি এখনও আমার ক্রিয়াকলাপটিকে ধ্বংস হতে দেয় বলে মনে হচ্ছে, যখন পিছনের বোতামটি টিপানো হয় তখন আমি কীভাবে আমার ক্রিয়াকলাপ ধ্বংস হতে বাধা দিতে পারি?


: একটি অনুরূপ প্রশ্ন নেই stackoverflow.com/questions/2459848/...
aleung


এছাড়াও আমি মনে করি আপনি `আপনার কোড পরিবর্তন করতে থাকেন (Integer.parseInt (android.os.Build.VERSION.SDK)> 5 আছে , the <` একটি হওয়া উচিত >
SudoPlz

1
আপনি যদি এটিকে সমাধান করেন, তবুও আপনাকে অবশ্যই সিস্টেমটি আপনার অ্যাপ্লিকেশনটি হত্যার সম্ভাবনাটি পরিচালনা করতে হবে, তাই না? মানে, নাল মামলা এখনও সম্ভব? বা যদি কোনও কারণে সিস্টেমটি আপনার অ্যাপ্লিকেশনটিকে হত্যা করে তবে তা কি আপনার বিজ্ঞপ্তিটি সরিয়ে দেবে? আমি ভাবছি এটি অবশ্যই একটি সমস্যা হতে পারে, যেহেতু অ্যাপ্লিকেশনটি না থাকলেও কোনও বিজ্ঞপ্তির উদ্দেশ্য বিদ্যমান।
টুলমেকারস্টেভ

উদাহরণস্বরূপ অ্যাপ্লিকেশন কোডটি freakyjolly.com/how-to-add-back-arrow-in-android-activity
কোড স্পাই

উত্তর:


276

আপনার কী শ্রোতা সরান বা আপনার trueযখন ফিরে আসবে KEY_BACK

আপনি শুধু ফিরে কী (নিশ্চিত করুন ফোন করতে না ধরতে নিম্নলিখিত প্রয়োজন সুপার মধ্যে onBackPressed())।

এছাড়াও, আপনি যদি ব্যাকগ্রাউন্ডে কোনও পরিষেবা চালানোর পরিকল্পনা করে থাকেন তবে তা নিশ্চিত করে দেখুন startForeground()এবং চলমান বিজ্ঞপ্তি রয়েছে কিনা তা নিশ্চিত করে নিন বা অন্য কোনও স্মৃতি মুক্ত করার প্রয়োজনে অ্যান্ড্রয়েড আপনার পরিষেবাটি মেরে ফেলবে।

@Override
public void onBackPressed() {
   Log.d("CDA", "onBackPressed Called");
   Intent setIntent = new Intent(Intent.ACTION_MAIN);
   setIntent.addCategory(Intent.CATEGORY_HOME);
   setIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
   startActivity(setIntent);
}

70

কেবলমাত্র এক লাইনের কোডের সাহায্যে এটি কার্যকর করা সহজ ছিল:

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

এটি গ্রহণযোগ্য উত্তর হওয়া উচিত। এটি প্রশ্নটি জিজ্ঞাসা করছে ঠিক তাই করে এবং কার্যক্ষমতায় ক্লিন বিল্ট ব্যবহার করে।
শাদোনিনজা

থানকিউ :) আপনি কি এর পেছনের ধারণাটি বিশদভাবে বলতে পারবেন?
ফররুখ ফাইজি

1
আপনি কেবল অনব্যাকপ্রেসড () ইভেন্টটিকে ওভাররাইড করুন, এটি ক্রিয়াকলাপটি পিছনে সরিয়ে নিয়েছে।
Squirrelkiller

1
আপনি যখন হোম স্ক্রীন থেকে অ্যাপটি পুনরায় চালু করবেন (যদি টাস্ক স্ট্যাকটিতে অন্য কোনও ক্রিয়াকলাপ থাকে) এই সমাধানটি কার্যকলাপটি ফিরিয়ে আনবে না।
ইগোরগানাপলস্কি

12

আমি মনে করি আপনি যা চান তা পিছনের বোতামটি ওভাররাইড করা নয় (এটি কেবল একটি ভাল ধারণা বলে মনে হয় না - অ্যান্ড্রয়েড ওএস সেই আচরণটি সংজ্ঞায়িত করে, কেন এটি পরিবর্তন করবে?), তবে ক্রিয়াকলাপ জীবনচক্র ব্যবহার করে এবং আপনার সেটিংস / ডেটা অব্যাহত রাখার জন্য onSaveInstanceState (বান্ডিল) ইভেন্ট।

@Override
onSaveInstanceState(Bundle frozenState) {
    frozenState.putSerializable("object_key",
        someSerializableClassYouWantToPersist);
    // etc. until you have everything important stored in the bundle
}

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

@Override
onCreate(Bundle savedInstanceState) {
    if(savedInstanceState!=null){ //It could be null if starting the app.
        mCustomObject = savedInstanceState.getSerializable("object_key");
    }
    // etc. until you have reloaded everything you stored
}

আপনাকে সঠিক দিকে নির্দেশ করতে উপরের চিত্রযুক্ত কোডটি বিবেচনা করুন। ক্রিয়াকলাপের জীবনচক্রটি পড়ার মাধ্যমে আপনি যা খুঁজছেন তা সম্পাদনের সর্বোত্তম উপায় নির্ধারণে আপনাকে সহায়তা করা উচিত।


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

5
আমি কমপক্ষে কয়েকটি পরিস্থিতি পেরিয়ে এসেছি যেখানে আমি নতুন ক্রিয়াকলাপ শুরু না করেই স্ট্যান্ডার্ড ক্রিয়াকলাপ স্ট্যাকের আচরণ অনুকরণ করতে চেয়েছিলাম। এই ক্ষেত্রে, আমি মনে করি, ডিফল্ট অনব্যাকপ্রেসড () আচরণটি ওভাররাইড করা উপযুক্ত। সাধারণত, যদিও আমি সম্মত: ওভাররাইডিং এড়ান।
ম্যাট ব্রায়ানন

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

1
OnSaveInstanceState এবং ডেটা সংরক্ষণ করা কি সম্পূর্ণ আলাদা প্রশ্ন?
টেড

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

11

এইভাবে ..

@Override
public void onBackPressed() {
    //super.onBackPressed();
}

//super.onBackPressed () মন্তব্য করে; কৌতুক করবে


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

হ্যাঁ, আপনি একেবারে সঠিক। এটি কেবল পিছনের বোতামটি ওভাররাইড করবে এবং আপনি কিছু যুক্তি না দেওয়া পর্যন্ত কিছুই করবে না। অ্যাপ্লিকেশনটি বন্ধ করতে বোতামটি ডাবল করার শর্ত হতে পারে বা আপনি কেবল চলমান ক্রিয়াকলাপ (অগ্রগতি ডায়ালগ) ইত্যাদি অক্ষম করতে চান, তবে এটি সম্পূর্ণ প্রয়োজন অনুসারে up
androCoder-BD


3

আপনি যদি পিছনের বোতামটির (ফোনের নীচে) এবং হোম বোতামের (অ্যাকশন বারের বাম দিকের) আচরণটি পরিচালনা করতে চান তবে আমি আমার প্রকল্পে এই কাস্টম ক্রিয়াকলাপটি আপনাকে সহায়তা করতে পারি ।

import android.os.Bundle;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;
import android.view.MenuItem;

/**
 * Activity where the home action bar button behaves like back by default
 */
public class BackActivity extends AppCompatActivity {

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

    private void setupHomeButton() {
        final ActionBar actionBar = getSupportActionBar();
        if (actionBar != null) {
            actionBar.setDisplayHomeAsUpEnabled(true);
            actionBar.setHomeButtonEnabled(true);
        }
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case android.R.id.home:
                onMenuHomePressed();
                return true;
        }
        return super.onOptionsItemSelected(item);
    }

    protected void onMenuHomePressed() {
        onBackPressed();
    }
}

আপনার ক্রিয়াকলাপে ব্যবহারের উদাহরণ:

public class SomeActivity extends BackActivity {

    // ....

    @Override
    public void onBackPressed()
    {
        // Example of logic
        if ( yourConditionToOverride ) {
            // ... do your logic ...
        } else {
            super.onBackPressed();
        }
    }    
}

1
@Override
public void onBackPressed() {
// Put your code here.
}

//I had to go back to the dashboard. Hence,

@Override
public void onBackPressed() {
    Intent intent = new Intent(this,Dashboard.class);
    startActivity(intent);
}
Just write this above or below the onCreate Method(within the class)

0

কোটলিনে:

val callback = requireActivity().onBackPressedDispatcher.addCallback(this) {
    // Handle the back button event
}

আরও তথ্যের জন্য আপনি না পরীক্ষা করতে এই

কোটলিনে ব্যাক বাটনকে ওভাররাইড করার বিষয়েও নির্দিষ্ট প্রশ্ন রয়েছে

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