অ্যান্ড্রয়েড: পূর্ববর্তী ক্রিয়াকলাপে ফিরে যান


524

আমি অ্যান্ড্রয়েড অ্যাপে সহজ কিছু করতে চাই। পূর্বের ক্রিয়াকলাপে ফিরে যাওয়া কীভাবে সম্ভব।

পূর্ববর্তী ক্রিয়াকলাপে ফিরে যাওয়ার জন্য আমার কী কোড দরকার


5
গত খোলা activiy সম্পর্কে অবগত থাকুন
ভুক

53
আপনি কেবল সাধারণ কল ফিনিস (); চিয়ার্স
এনগুইন মিনহ বিন

super.finish (); আপনি যদি ক্রিয়াকলাপের ভিতরে থেকে এটি কল করছেন!
হ্যাপিহার্ডিক

5
এখানে একটি প্রশ্ন: অ্যান্ড্রয়েড যদি কম স্মৃতি বা অন্যান্য সমস্যার কারণে পূর্ববর্তী ক্রিয়াকলাপটিকে ধ্বংস করে দেয়, তবে সেই ক্রিয়াকলাপটি আর পিছনে থাকবে না এবং তারপরে কী হবে?
সানি

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

উত্তর:


486

অ্যান্ড্রয়েড ক্রিয়াকলাপগুলি ক্রিয়াকলাপের স্ট্যাকে সঞ্চিত। পূর্ববর্তী ক্রিয়াকলাপে ফিরে যাওয়ার অর্থ দুটি জিনিস হতে পারে।

  1. আপনি স্টার্টঅ্যাক্টিভিটি ফর রিসাল্ট সহ অন্য ক্রিয়াকলাপ থেকে নতুন ক্রিয়াকলাপটি খুললেন । সেক্ষেত্রে আপনি আপনার কোড থেকে ফিনিশিং অ্যাকটিভিটি () ফাংশনটি কল করতে পারেন এবং এটি আপনাকে আগের ক্রিয়াকলাপে ফিরিয়ে নিয়ে যাবে।

  2. ক্রিয়াকলাপের স্ট্যাকের উপর নজর রাখুন। যখনই আপনি কোনও অভিপ্রায় নিয়ে একটি নতুন ক্রিয়াকলাপ শুরু করেন আপনি FLAG_ACTIVITY_REORDER_TO_FRONTবা এর মতো কোনও অভিপ্রায়ের পতাকা নির্দিষ্ট করতে পারেন FLAG_ACTIVITY_PREVIOUS_IS_TOP। আপনি আপনার প্রয়োগের ক্রিয়াকলাপগুলির মধ্যে এলোমেলো করতে এটি ব্যবহার করতে পারেন। যদিও সেগুলি বেশি ব্যবহার করেন নি। এখানে পতাকাগুলি দেখুন: http://developer.android.com/references/android/content/Inttent.html

মন্তব্যে উল্লিখিত হিসাবে, যদি ক্রিয়াকলাপটি খোলা হয় startActivity()তবে কেউ এটি দিয়ে এটি বন্ধ করতে পারে finish()। আপনি যদি আপ বোতামটি ব্যবহার করতে চান তবে মন্তব্যে উল্লিখিত মতবিরোধের তুলনায় onOptionsSelected(MenuItem item)আইটেম আইডি পরীক্ষা করে পদ্ধতিতে আপনি এটি ধরতে পারেন ।android.R.id.homeR.id.home


237
বা আপনি যদি স্টার্টঅ্যাক্টিভিটি () দিয়ে কার্যকলাপ খোলেন, আপনি ফিনিস () দিয়ে কোনও বন্ধ করতে পারেন (কোনও প্যারামিটার পাস করার দরকার নেই)
নিউইর্ল্ড

3
আপনি কীভাবে এবং কীভাবে
ফিনিসটি

4
@ রিকনজেশ আপনার অনওশনশাস্ত্র নির্বাচিত পদ্ধতিতে যদি মেনুতেমে ক্লিক করা থাকে R.id.home আইডি থাকে তবে কল ফিনিস () কল করুন। এটি বর্তমান ক্রিয়াকলাপ বন্ধ করে দেবে এবং আপনাকে সেই ক্রিয়াকলাপে ফিরিয়ে নিয়ে যাবে যা এটি
সূচনাঅ্যাক্টিভিটি

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

1
আপনি কি নিশ্চিত যে ক্রিয়াকলাপ 2 শেষ করার আগেই ক্রিয়াকলাপ 1 কখনই মারা যাবে না?
ব্যবহারকারী 924

225

ব্যবহার করে দেখুন Activity#finish()। এটি ডিফল্টরূপে ব্যাক বোতামটি কমবেশি করে।


1
কেন #? না এটি একটি বিন্দু?
নবীন

8
আমি বিশ্বাস করি তার অর্থ ছিলthis.finish();
জেনস বোডাল

69
এটি #এমন একটি সূচক যা finish()ক্রিয়াকলাপ শ্রেণীর একটি অ স্থির পদ্ধতি। এটি বৈধ জাভা নয়, তবে এটি কীভাবে পদ্ধতিটি ব্যবহার করতে পারে তা ব্যাখ্যা করতে সহায়তা করে।
ব্রায়ান হার্বস্ট

2
@ Tanis.7x আছে এবং স্থির পদ্ধতিগুলির জন্য সূচক আছে?
বেন্টেন

8
@ বেন্টেন এটি হবে ., অর্থাত:Activity.someStaticMethod()
জনি রাইভেস

81

শুধু ক্লিক ফিনিস () এ লিখুন । এটি আপনাকে পূর্ববর্তী ক্রিয়াকলাপে নিয়ে যাবে।


1
যদিও অনব্যাকপ্রেসড () পাশাপাশি কাজ করে, আমি মনে করি যে এই সমাধানটি আপনার কেবলমাত্র কিছু সময়ের জন্য প্রয়োজন এমন কোনও ক্রিয়াকলাপটি থেকে বেরিয়ে আসার কথা চিন্তা করার জন্য ভাল .. উদাহরণস্বরূপ আমার ক্ষেত্রে ওসিআর স্ক্যানার। ধন্যবাদ!
জিন বো বো

এটি আমার প্রয়োজনটি পূরণ করে .. ধন্যবাদ।
Roon13

68

শুধু এটা

super.onBackPressed();

2
এই কলটি কেবলমাত্র বর্তমান ক্রিয়াকলাপ শেষ করে, তাই এটি শেষ ক্রিয়াকলাপটি দৃশ্যমান দেখায়। তবে, যদি কোনও পূর্ববর্তী কার্যকলাপ থাকে না বা এর মধ্যেই এটি ধ্বংস হয়ে যায় তবে অ্যাপ্লিকেশনটি প্রস্থান করতে পারে।
r1k0

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

33
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

এটি আপনাকে পূর্ববর্তী ক্রিয়াকলাপে স্ট্যাকটি রেখে এবং স্ট্যাক থেকে সমস্ত ক্রিয়াকলাপ সাফ করে দেবে।

উদাহরণস্বরূপ, যদি স্ট্যাকটি A-> বি-> সি-> ডি হয় এবং আপনি এই পতাকাটি দিয়ে বি শুরু করেন তবে স্ট্যাকটি এ-> বি হবে


এটি আমার শেষের দিকে কাজ করে। কাজ শেষ না করার কারণ কী হবে তা খুঁজে পেতে পছন্দ করবেন।
Relm

20

আপনি কি পিছনের বোতামের আচরণটি নিয়ন্ত্রণ করতে চান? আপনি দুটি পদ্ধতির একটির মাধ্যমে পিছনের বোতামটি (একটি নির্দিষ্ট ক্রিয়াকলাপে যাওয়ার জন্য) ওভাররাইড করতে পারেন।

অ্যান্ড্রয়েড 1.6 এবং নীচের জন্য:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event)  {
    if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
        // do something on back.
        return true;
    }

    return super.onKeyDown(keyCode, event);
}

বা যদি আপনি কেবল অ্যান্ড্রয়েড 2.0 বা আরও বেশি সমর্থন করে থাকেন:

@Override
public void onBackPressed() {
    // do something on back.
    return;
}

বিস্তারিত জানতে দেখুন: http://android-developers.blogspot.com/2009/12/back-and-other-hard-keys-three-stories.html


19

কেবলমাত্র বর্তমান ক্রিয়াকলাপ শেষ করতে বা অনব্যাকপ্রেসড দিয়ে ফিরে যেতে এই পদ্ধতিটি কল করুন

finish();

অথবা

onBackPressed();

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

13

আপনি যদি যেতে চান তবে কেবল পূর্ববর্তী ক্রিয়াকলাপ ব্যবহারে যেতে চান

finish();

অথবা

onBackPressed();

যদি আপনি দ্বিতীয় ক্রিয়াকলাপে যেতে চান বা নীচের নীচে ব্যবহার করতে চান:

intent = new Intent(MyFourthActivity.this , MySecondActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
//Bundle is optional
Bundle bundle = new Bundle();
bundle.putString("MyValue1", val1);
intent.putExtras(bundle);
//end Bundle
startActivity(intent);

1
আমি ফিনিসটি () এবং অনব্যাকপ্রেসড () উভয়ই কাজ দেখতে পেয়েছি, তবে আমার অ্যাপে অন্তত ফিনিস () খুব ধীর এবং অনব্যাকপ্রেসড () অনেক দ্রুত। অদ্ভুত।
স্ক্রয়েন

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

13

এটি আপনার অনিক্লিক () পদ্ধতিতে যুক্ত করুন, এটি আপনার আগের ক্রিয়াকলাপে ফিরে যাবে

শেষ ();

অথবা আপনি এটি ব্যবহার করতে পারেন। এটা আমার জন্য পুরোপুরি কাজ করেন

 @Override
  public boolean onOptionsItemSelected(MenuItem item) {
  int id = item.getItemId();

      if ( id == android.R.id.home ) {
         finish();
         return true;
       }

  return super.onOptionsItemSelected(item);
  }

11

আপনার যদি ক্রিয়াকলাপের প্যারেন্টের সাথে অ্যান্ড্রয়েড ম্যানিফেস্ট.এক্সএমএল ফাইলটি সঠিকভাবে সেটআপ করা থাকে তবে আপনি ব্যবহার করতে পারেন:

NavUtils.navigateUpFromSameTask(this);

এটি আপনার সন্তানের ক্রিয়াকলাপ।




7

একই সমস্যা পেয়েছি এবং

finish();  OR super.onBackPressed();

আমার পক্ষে ভাল কাজ করেছে, দুজনেই একই কাজ করেছে, তবে ভাগ্য ভাল নয় return


6

অভিপ্রায় ব্যবহার করে দ্বিতীয় ক্রিয়াকলাপ শুরু করুন (হয় ব্যবহার করুন startActivityবা startActivityForResultআপনার প্রয়োজনীয়তা অনুসারে)। এখন যখন ব্যবহারকারী পিছনে বোতাম টিপুন, উপরের বর্তমান ক্রিয়াকলাপটি বন্ধ হয়ে যাবে এবং পূর্ববর্তীটি প্রদর্শিত হবে।

এখন বলুন আপনার দুটি ক্রিয়াকলাপ রয়েছে, একটি ব্যবহারকারীর জন্য কিছু সেটিংস বাছাই করার জন্য ভাষা, দেশ ইত্যাদি and এখন যদি লগইন ব্যর্থ হয়, তবে ব্যবহারকারী লগইন ক্রিয়াকলাপে থাকবে, লগইন সফল হলে কী হবে?

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


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

5

আপনি এটি চেষ্টা করতে পারেন:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {

        finish();
        return true;
    }
    return super.onKeyDown(keyCode, event);
}

4

পূর্বনির্ধারিত সমস্ত নতুন ক্রিয়াকলাপ / ইন্টেন্টগুলির পূর্ববর্তী / পূর্ববর্তী আচরণ থাকে, যদি না আপনি finish()কলিং ক্রিয়াকলাপটি কোড করে থাকেন।


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

এবং যদি আপনি বাটন ক্লিক করতে চান ফিরে যান তবে সহজভাবে রাখুন

bbsubmit.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        onBackPressed();
    }
});

3
 @Override
 public boolean onOptionsItemSelected(MenuItem item) {
      int id = item.getItemId();

      if ( id == android.R.id.home ) {
          finish();
          return true;
      }

      return super.onOptionsItemSelected(item);
 }

এটি চেষ্টা করে এটি সরঞ্জামদ্বার ব্যাক বোতামে হার্ডওয়্যার ব্যাক বোতাম হিসাবে উভয়ই কাজ করে ।


2

আমি NavUtils.navigateUpFromSameTask () এর পরামর্শ দিচ্ছি, এটি সহজ এবং খুব সহজ, আপনি এটি গুগল বিকাশকারী থেকে শিখতে পারেন ishআমি আপনাকে সহায়তা করতে পারতাম!


1

আপনার আগের ক্রিয়াকলাপে ফিরে যাওয়ার জন্য কয়েকটি মামলা রয়েছে:

কেস 1: আপনি যদি নিজের আগের ক্রিয়াকলাপে ফলাফল নিতে চান তবে ActivityA.java

 Intent intent = new Intent(ActivityA.this, FBHelperActivity.class);
               startActivityForResult(intent,2);

FBHelperActivity.java

 Intent returnIntent = new Intent();
 setResult(RESULT_OK, returnIntent);
 finish();

কেস 2: ক্রিয়াকলাপ - - এফবিহেলপারঅ্যাক্টিভিটি ----> ক্রিয়াকলাপএ

ActivityA.java

 Intent intent = new Intent(ActivityA.this, FBHelperActivity.class);
               startActivity(intent);

FBHelperActivity.java

after getting of result call finish();
 By this way your second activity will finish and because 
 you did not call finish() in your first activity then
 automatic first activity is in back ground, will visible.

1

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

এর পরে আপনার বর্তমান ক্রিয়াকলাপ থেকে পূর্বের ক্রিয়াকলাপে ফিরে যাওয়ার দুটি উপায় রয়েছে:

কেবল কল করুন: finish()বোতামের নীচে ক্লিক শ্রোতাদের, বা সিস্টেম ব্যাক বোতামটি ব্যবহার করে ব্যাক করতে নিম্নলিখিত পদ্ধতিটি ওভাররাইড করুন:

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

0

উল্লিখিত সমস্ত উত্তর ছাড়াও এগুলি এখনও এটি করার একটি বিকল্প উপায় say

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

http://whats-online.info/science-and-tutorials/125/Android-maintain-the-previous-state-of-activity-on-intent/

অথবা

http://developer.android.com/reference/android/content/Intent.html


0

প্রথম ক্রিয়াকলাপটি এটিকে চেষ্টা করে দেখুন

Intent mainIntent = new Intent(Activity1.this, Activity2.class);
this.startActivity(mainIntent);

আপনার দ্বিতীয় ক্রিয়াকলাপে

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

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