হোম বোতামের মতো কাজ করতে পিছনে বোতামটি ওভাররাইড করুন


253

পিছনের বোতামটি টিপে, আমি চাই আমার অ্যাপ্লিকেশনটি ধ্বংস হওয়া অবস্থার চেয়ে থামানো অবস্থায় চলে।

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

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

আমি কীভাবে আমার নিজের প্রয়োগটিতে এই কার্যকারিতাটির প্রতিলিপি করব?

আমি মনে করি তিনটি সম্ভাবনা থাকতে হবে ...

  1. পিছনের বোতাম টিপুন (নীচে হিসাবে) এবং তারপরে হোম বোতাম কল করুন যেকোন পদ্ধতিতে (গুলি) কল করুন।

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if ((keyCode == KeyEvent.KEYCODE_BACK)) {
            Log.d(this.getClass().getName(), "back button pressed");
        }
        return super.onKeyDown(keyCode, event);
    }
  2. পিছনের বোতাম টিপুন এবং তারপরে একটি হোম বোতাম টিপুন।

  3. পিছনের বোতাম টিপুন ক্যাপচার করুন, তারপরে হোম স্ক্রিনের একটি ক্রিয়াকলাপ শুরু করুন, কার্যকরভাবে আমার অ্যাপ্লিকেশনটির ক্রিয়াকলাপটি থামানো অবস্থায় রেখে দিন।

সম্পাদনা: আমি পরিষেবাদি সম্পর্কে জানি এবং এই সমস্যার সাথে সম্পর্কিত এমন একটি অ্যাপ্লিকেশনটিতে ব্যবহার করছি। এই প্রশ্নটি বিশেষত পিছনের বোতামটি টিপানোর পরে ধ্বংস হওয়া রাষ্ট্রের চেয়ে ক্রিয়াকলাপটিকে থামানো স্থানে রাখার বিষয়ে।


একটি অনুরূপ উত্তর দেখুন stackoverflow.com/questions/5914040/…
জার ই আহমের

উত্তর:


338

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

একটি সহজ পদ্ধিতি হ'ল নীচেBack বাটন টিপুন এবং মুভটাস্কটব্যাক (সত্য) কল করুন :

// 2.0 and above
@Override
public void onBackPressed() {
    moveTaskToBack(true);
}

// Before 2.0
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK) {
        moveTaskToBack(true);
        return true;
    }
    return super.onKeyDown(keyCode, event);
}

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

দ্রষ্টব্য : ডেভ দ্বারা অ্যান্ড্রয়েড ২.০ এর নীচে নির্দেশিত হিসাবে একটি নতুন onBackPressedপদ্ধতি প্রবর্তন করা হয়েছে এবং কীভাবে পিছনে বোতামটি পরিচালনা করতে হবে সে সম্পর্কে এই প্রস্তাবনাগুলি


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

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

ধন্যবাদ মিরকো, পদ্ধতিটি ভালভাবে কাজ করছে বলে মনে হচ্ছে। আপনি যদি এই প্রশ্নের উত্তর পরে দেখেন তাদের উত্তরটির নীচে আপনার সম্পাদনাটিকে আরও বেশি গুরুত্ব দেন তবে এটি দুর্দান্ত হতে পারে - যা আমি খুঁজছিলাম তার মতোই!
বিডলস

4
পিছনের কীটি হ্যান্ডেল করার জন্য প্রস্তাবিত উপায়ের জন্য দয়া করে android-developers.blogspot.com/2009/12/… পড়ুন ।
হ্যাকবড

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


23

আপনি যদি পিছনে বাটনটি ধরতে চান তবে অ্যানড্রয়েড বিকাশকারী ব্লগে এই পোস্টটি একবার দেখুন । এটি অ্যান্ড্রয়েড 2.0 তে এটি করার সহজ উপায় এবং 1.x এবং 2.0 তে চলে এমন কোনও অ্যাপ্লিকেশনটির জন্য এটি করার সর্বোত্তম উপায় covers

তবে, যদি আপনার ক্রিয়াকলাপ বন্ধ হয়ে যায় তবে এটি ডিভাইসে মেমরির উপলব্ধতার উপর নির্ভর করে নিহত হতে পারে। আপনি যদি কোনও ইউআই না দিয়ে কোনও প্রক্রিয়া চালাতে চান তবে আপনার একটি তৈরি করা উচিত Serviceডকুমেন্টেশন পরিষেবা সম্পর্কে নিম্নলিখিত বলে:

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

এগুলি আপনার প্রয়োজনীয়তার জন্য উপযুক্ত বলে মনে হচ্ছে।


18

onBackPressed()অ্যান্ড্রয়েড.অ্যাপ.অ্যাক্টিভিটি ক্লাসে সংজ্ঞায়িত শূন্যটিকে ওভাররাইড করার চেষ্টা করুন ।


1
যেহেতু অ্যান্ড্রয়েড 2.0 এটি ওভাররাইড করার জন্য সঠিক জিনিস। developer.android.com/sdk/android-2.0.html
জয়

14

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

@Override
public void onBackPressed() {
// check if page 2 is open
    RelativeLayout page2layout = (RelativeLayout)findViewById(R.id.page2layout);
    if(page2layout.getVisibility() == View.VISIBLE){
        togglePageLayout(); // my method to toggle the views
        return;
    }else{
        super.onBackPressed(); // allows standard use of backbutton for page 1
    }

}

আশা করি এটি কাউকে সাহায্য করবে, চিয়ার্স


10

কাজের উদাহরণ ..

নিশ্চিত করুন যে সুপার.অনব্যাকপ্রেসড () কল করবেন না;

@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);
}

এইভাবে আপনার পিছনের বোতামটি হোম বোতামের মতো কাজ করে। এটি আপনার ক্রিয়াকলাপ শেষ করে না তবে এটি ব্যাকগ্রাউন্ডে নিয়ে যায়

দ্বিতীয় উপায় হ'ল কল moveTaskToBack(true);করা onBackPressedএবং সরাতে ভুলবেন না besuper.onBackPressed


0

আরও ভাল, অনপজ সম্পর্কে কীভাবে () :

যখন কোনও ক্রিয়াকলাপ পটভূমিতে চলে যায় তখন কার্যকলাপ ক্রিয়াকলাপের অংশ হিসাবে ডাকা হয়, তবে (এখনও) নিহত হয় নি। OnResume () এর প্রতিচ্ছবি।

যখন ক্রিয়াকলাপ বি এর ক্রিয়াকলাপ A এর সামনে চালু করা হবে, তখন এ কলব্যাক এ চালু করা হবে এ এর ​​অনপেজ () ফিরে enter code hereনা আসা অবধি বি তৈরি করা হবে না, সুতরাং এখানে দীর্ঘতর কিছু না করার বিষয়ে নিশ্চিত হন ।

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

পরবর্তী ক্রিয়াকলাপটি যত দ্রুত সম্ভব স্যুইচ করার জন্য, বা ক্যামেরার মতো একচেটিয়া অ্যাক্সেস রয়েছে এমন সংস্থানগুলি বন্ধ করার জন্য, অ্যানিমেশনগুলি থামানো এবং অন্যান্য জিনিসগুলির মতো কাজগুলি করার পক্ষে এটি খুব ভাল জায়গা।


0

অ্যান্ড্রয়েড 2.0 এর পরে অনব্যাকপ্রেসড () ওভাররাইড করুন। যেমন

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

0

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

উদ্দেশ্য.এফএলএজি_এসিটিভিটি_সিএলইআরএইচপি_ইপ কী।

  @Override
  public void onBackPressed() {
      Intent intent = new Intent(this, MainActivity.class);
      intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
      startActivity(intent);
  }

-1

আমার কাছে নতুন কাস্টম এডিটেক্সট তৈরি করে @ মিরকো এন

 public class EditViewCustom extends EditText {

    Button cancelBtn;
    RelativeLayout titleReleLayout;
    public EditViewCustom(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    public EditViewCustom(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public EditViewCustom(Context context) {
        super(context);
    }

    public void setViews(Button cancelBtn,RelativeLayout titleReleLayout){
        this.cancelBtn = cancelBtn;
        this.titleReleLayout = titleReleLayout;
    }

    @Override
    public boolean onKeyPreIme(int keyCode, KeyEvent event) {
        if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
            Log.d("KEYCODE_BACK","KEYCODE_BACK");
            cancelBtn.setVisibility(View.GONE);
            this.setFocusableInTouchMode(false);
            this.setFocusable(false);
            titleReleLayout.setVisibility(View.VISIBLE);

            return super.onKeyPreIme(keyCode, event);
          }

        return super.onKeyPreIme(keyCode, event);
    }

}

তারপরে আপনার ক্রিয়াকলাপ থেকে ডেটা সেট করুন

 searchEditView.setViews(cancelBtn, titleRelativeLayout);

ধন্যবাদ.

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