কীভাবে কার্যকলাপ বন্ধ করবেন এবং অ্যান্ড্রয়েডে আগের ক্রিয়াকলাপে ফিরে যেতে পারেন


144

আমার একটি প্রধান ক্রিয়াকলাপ রয়েছে, আমি যখন একটি বোতামে ক্লিক করি, একটি নতুন ক্রিয়াকলাপ শুরু করি, তখন আমি নীচের কোডটি ব্যবহার করে তা করি:

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

উপরের কোডটি মূল ক্রিয়াকলাপ থেকে চালানো হয়েছিল।

এখন আমার নতুন ক্রিয়াকলাপে যা মূল ক্রিয়াকলাপ বলে ডাকে, আমার পিছনের বোতামটি রয়েছে। আমি যখন এই ব্যাক বোতামটিতে ক্লিক করি তখন আমি চাই যে আমার নতুন ক্রিয়াকলাপটি বন্ধ হয়ে যাবে এবং এটি অবশ্যই মূল মূল ক্রিয়াকলাপে ফিরে যেতে হবে।

আমি কল করার চেষ্টা করেছি super.finish()এবং ঠিক finish() (নতুন ক্রিয়াকলাপ থেকে) তবে এটি তখন আমার সম্পূর্ণ অ্যাপ্লিকেশনটি বন্ধ করে দেয় (আমার মূল ক্রিয়াকলাপ সহ)।

আমি কীভাবে কেবলমাত্র ফোকাসে থাকা কার্যকলাপটি বন্ধ করতে পারি এবং তারপরে মূল ক্রিয়াকলাপে ফিরে যেতে পারি?

সম্পাদিত

আমার ফোনের পিছনের বোতামটিও আমার সম্পূর্ণ অ্যাপটি বন্ধ করে দেয় এই বিষয়টি আমাকে ভাবতে পরিচালিত করে যে আমি দ্বিতীয় কার্যকলাপটি ভুলভাবে শুরু করেছি?


ঠিক আছে আমি খুঁজছি,

আমি একটি সেটিংস ক্রিয়াকলাপ তৈরি করেছি যা ক্রিয়াকলাপ শুরু করতে একই ম্যানিফেস্ট কোড এবং একই কোড ব্যবহার করে।

সেটিংস ক্রিয়াকলাপের জন্য যখন আমি পিছনের বোতামটি চাপি তখন এটি মূল ক্রিয়ায় ফিরে আসে।

মূল প্রশ্নের উপরে উল্লিখিত ক্রিয়াকলাপটি সহ এটি আমার সম্পূর্ণ অ্যাপ্লিকেশনটি কেবল প্রস্থান করে।

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


4
আপনার এমনকি একটি ব্যাক বোতামেরও দরকার নেই, কেবল ব্যবহারকারীকে ফোন ব্যাক কী ব্যবহার করতে দিন এবং আপনাকে কিছু করতে হবে না।
হোয়ান এনগুইন

ফোন ব্যাক বোতামটি কেবলমাত্র আমার দ্বিতীয় কার্যকলাপ নয়, প্রবেশের অ্যাপ্লিকেশনটি বন্ধ করে দেয়। আমি মূল কার্যকলাপটি বন্ধ করতে চাই না।
জাপানোলজিকা

1
'পিছনে' বোতামটি এমনটি করা উচিত নয় - আপনি কি আপনার কোডটি আরও দেখাতে পারবেন?
peejaybee

আপনার সম্পাদনার প্রতিক্রিয়া হিসাবে, গৌণ ক্রিয়াকলাপটি আপনি যা পোস্ট করেছেন তা থেকে দুর্দান্ত দেখাচ্ছে। আমি মনে করি টিজিএমসিয়ানদের সম্ভবত সঠিক উত্তর রয়েছে এবং আপনি নিজের প্রকাশটি তদন্ত করেন।
peejaybee

এই উত্তরটি দেখুন দেখুন আমি মনে করি এটি আপনাকে সাহায্য করবে
মুহাম্মদ হেলমি

উত্তর:


201

আমি মনে করি আপনি শুরু করার আগেই finish()পদ্ধতিটি কল করছেন ।MainActivitySettingsActivity

আপনি বর্ণিত দৃশ্যটি নিম্নলিখিত দুটি উপায়ে ঘটবে:

উভয়

আপনি সেট আছে android:noHistory = "true"জন্য MainActivityভিতরে AndroidManifest.xmlযা ঘটায় MainActivityকরতেfinish পিছনে কী টিপে স্বয়ংক্রিয়ভাবে।

অথবা

আপনার 'SettingsActivity' থেকে স্যুইচ করার আগে, আপনি বলা finish()আপনার MainActivityযা হত্যা করে। আপনি যখন পিছনে বোতাম টিপেন, যেহেতু অন্য কোনও ক্রিয়াকলাপ পপ করতে স্ট্যাকের আগে থেকে নেই, এটি মূল স্ক্রিনে ফিরে যায়।


এটি কেন ফোনের 'পিছনে' বোতামটি মূল ক্রিয়াকলাপটি বাতিল করে দেয় তা ব্যাখ্যা করবে।
peejaybee

ডিবাগিংয়ের সময়, আমি লক্ষ করেছি যে সমাপ্তি শেষ হওয়ার পরে () কার্যকর হয়, সুতরাং এটি ছাড়াও কোনও রিটার্ন দেওয়া ভাল।
ততক্ষণ

এই উত্তরের তৃতীয় কারণটি কেবল প্রথমটির পুনরাবৃত্তি নয়?
প্যাং

60

আপনি যে ক্রিয়াকলাপটি করছেন তাতে কেবল ফিনিস () কল করে আপনি আগের ক্রিয়াকলাপে ফিরে যেতে পারেন। ফিনিস () কলটি পরিচালিত হওয়ার পরে যে কোনও কোড নোট করুন - এটি ঠিক করার জন্য আপনি কলিং ফিনিস () এর পরে কেবল একটি রিটার্ন করতে পারেন।

আপনি যদি একটিকে ক্রিয়াকলাপে ফিরে আসতে চান তবে দুটি ক্রিয়াকলাপ শুরু করার সময় আপনার প্রয়োজন:

startActivityForResults(myIntent, MY_REQUEST_CODE);

আপনার তথাকথিত ক্রিয়াকলাপের অভ্যন্তরে আপনি অনক্রিট () পরামিতিটি ব্যবহার করতে বা ব্যবহার করতে পারেন

getIntent();

ক্রিয়াকলাপের প্রথমটিতে একটি ফলাফল পুনরায় সেট করতে ক্রিয়াকলাপে দুটি করুন

setResult(Activity.RESULT_OK, MyIntentToReturn);

আপনার যদি ফিরে আসার কোনও উদ্দেশ্য নেই তবে কেবল বলুন

setResult(Activity.RESULT_OK);

যদি ক্রিয়াকলাপটির খারাপ ফলাফল থাকে তবে আপনি ক্রিয়াকলাপটি ব্যবহার করতে পারেন REআরআইসেলT_CANCELED (এটি ডিফল্টরূপে ব্যবহৃত হয়)। তারপরে ক্রিয়াকলাপে আপনি এটি করেন

onActivityResult(int requestCode, int resultCode, Intent data) {
    // Handle the logic for the requestCode, resultCode and data returned...
}

ক্রিয়াকলাপ শেষ করতে আপনার ফলাফল ইতিমধ্যে সেট সহ উপরে বর্ণিত ফিনিস () সমেত দুটি একই পদ্ধতি ব্যবহার করুন।


1
"ফিনিস () কলটি পরিচালিত হওয়ার পরে যে কোনও কোড নোট করুন - আপনি এইটি ঠিক করার জন্য ফিনিস () কল করার পরে কেবল একটি রিটার্ন করতে পারেন" আমার মনে হয় 'ফিক্স' এখানে শব্দের একটি খারাপ পছন্দ। এটি আরও বেশি ভালো লাগে যে আপনি নিম্নলিখিত লাইনগুলি কার্যকর করা এড়িয়ে যাচ্ছেন (স্থিরকরণ নয়)।
লো-টান

14

আপনি যখন নিজের বোতামটি ক্লিক করেন তখন কল করতে পারেন:

super.onBackPressed();

11

আপনি যদি খণ্ড ব্যবহার করেন তবে আপনার ব্যবহার করা উচিত

getActivity().onBackPressed();

আপনি যদি একক কার্যকলাপ ব্যবহার করেন তবে আপনি ব্যবহার করতে পারেন

finish();

7

পরিবর্তে এই কোড চেষ্টা করুন finish:

onBackPressed();


2
ActivityB থেকে ActivityA এ ফিরে যাওয়ার জন্য দুর্দান্ত কাজ করে। খণ্ড এবং একক ক্রিয়াকলাপের জন্য @ ওসামা ইব্রাহিমের উত্তরটি ব্যবহার করতে পারে।
ইফতেখারী

4

আপনি এটিকে খুব শক্ত করে তুলছেন। আপনি যদি সঠিকভাবে করার চেষ্টা করছেন তা যদি আমি বুঝতে পারি, বিল্ট ইন 'ব্যাক' বোতামটি এবং অ্যান্ড্রয়েড নিজেই আপনার জন্য সমস্ত কাজ করবে: http://developer.android.com/guide/compferences/tasks-and-back- stack.html

এছাড়াও, একটি কাস্টম "ব্যাক" বোতাম বাস্তবায়ন করাই কোর অ্যাপের গুণাবলী নির্দেশিকা ইউএক্স-এন 1: লঙ্ঘন করেছে: http://developer.android.com/distribute/googleplay/quality/core.html


4
Button edit = (Button) view.findViewById(R.id.yourButton);
edit.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View view) {
        Intent intent = new Intent(this, YourMainActivity.class);
        startActivity(intent);
        finish();
    }
});

4

এটি সম্পূর্ণ অ্যাপ্লিকেশনটি বন্ধ করে দেয়:

this.finish();

এটি কেবলমাত্র বর্তমান ক্রিয়াকলাপ নয়, ফোনের পিছনে বোতামটি কীভাবে প্রশ্ন করেছে সে হিসাবে পুরো অ্যাপ্লিকেশনটি বন্ধ করে দেয়?
জাপানোলজিকা

ক্যামেরা ক্রিয়াকলাপ থেকে আমি কীভাবে পূর্ববর্তী ক্রিয়াকলাপে উঠতে পারি।
কোডারপিসি

2
না, তা হয় না। এটি কেবলমাত্র বর্তমান ক্রিয়াকলাপ বন্ধ করে দেয়। দেখুন: বিকাশকারী.অ্যান্ড্রয়েড.
com

4

আমি বিশ্বাস করি আপনার দ্বিতীয় ক্রিয়াকলাপটি সম্ভবত শিশু কার্যকলাপ হিসাবে আপনার মূল ক্রিয়াকলাপের সাথে যুক্ত নয়। আপনার AndroidManifest.xmlফাইলটি পরীক্ষা করে দেখুন এবং <activity>আপনার সন্তানের ক্রিয়াকলাপের জন্য এন্ট্রিতে কোনও android:parentActivityNameবৈশিষ্ট্য রয়েছে কিনা তা দেখুন । এটি দেখতে কিছু দেখতে হবে:

<?xml ...?>
...
<activity
    android:name=".MainActivity"
    ...>
</activity>
<activity
    android:name=".ChildActivity"
    android:parentActivityName=".MainActivity"
    ...>
</activity>
...

1

কেবল আপনার কাছে কল করবেন না finish()এটি আপনার MainActivityনিজের onBackPressed()মধ্যে ওভাররাইড করার প্রয়োজনীয়তা বাদ দেয় SecondActivityযদি না আপনি সেই ফাংশনে অন্যান্য জিনিস না করেন। আপনি এই ব্যাক বোতাম জন্য "প্রয়োজন" যদি মনে করেন তাহলে আপনি কেবল কল করতে পারেন finish()উপর SecondActivityএবং আপনার নিয়ে যাবে MainActivityযতদিন না পর্যন্ত আপনি বলা হয় না হিসাবে finish()এটি উপর


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

আপনি পিছনের বোতামটি কী করতে চান? পূর্ববর্তী যা কিছু Activityছিল ফিরে যান বা সর্বদা ফিরে যান MainActivity? এছাড়াও, আপনি যদি স্মৃতি থেকে দূরে চলে যান Bitmapsতবে আপনার ডক্সের এই অংশটি পড়া উচিত । এটি আমাকে সহায়তা করেছিল
কোডমাজিক

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

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

@ লো-টান আমি মনে করি আপনি অনব্যাকপ্রেসড () পদ্ধতিটি ওভাররাইড করতে চান এবং তারপরে আপনি নিজে যেতে চান এমন ক্রিয়াকলাপটি নিজেই তৈরি করতে চান। তারপরে আপনি যা করছেন তার শেষ এবং আগেরটি শুরু করতে পারেন।
Zapnologica

1

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

ক্রিয়াকলাপ_এ -> ক্রিয়াকলাপ_বি -> ক্রিয়াকলাপ_সি

ক্রিয়াকলাপ_এ (সাধারণত ক্রিয়াকলাপ_বি খোলে)

ক্রিয়াকলাপ_বি (কিছু বোতামে ক্লিক ক্রিয়াকলাপ_সি খোলে):

// Global:
boolean its_detail = false;
// -------
SharedPreferences prefs =  getApplicationContext().getSharedPreferences("sharedpreferences", 0);
boolean v = prefs.getBoolean("select_client", false);

its_detail = v;

startActivity(C);

@Override
public void onResume(){
     super.onResume();
     if(its_detail == true){
        finish();
     }
}

সুতরাং, যখনই আমি ক্রিয়াকলাপ সিটির বোতামটি ক্লিক করি এটি কার্যকলাপ বি এর "অনারুমিউম ()" ফাংশনটি করে এবং ক্রিয়াকলাপ এ এ ফিরে যায় A.


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

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

        return super.onOptionsItemSelected(item);
    }

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


এই আমার জন্য কাজ করে। আমি একটি ছিল MainActivity এবং SettingsActivity সঙ্গে android:parentActivityName=".MainActivity"দ্বিতীয় জন্য। এই কোডটি টুলবেটের সেই হোম / পিছনের বোতামটি পরিচালনা করে এবং কেবল স্ট্যাকের আগেরটিতে ফিরে আসা বর্তমান ক্রিয়াকলাপটি শেষ করে। ধন্যবাদ।
মর্টালিস

1

সমাপ্তি পুরো অ্যাপ্লিকেশনটি বন্ধ করে দেয়, এটি এমনটি যা আমি অ্যান্ড্রয়েড বিকাশে ঘৃণা করি তা ভাল না তবে তারা যে বুদ্ধি ঠিক সিনট্যাক্স রাখে না

startActivity(intent)

কেন না

ক্লোজঅ্যাক্টিভিটি (অভিপ্রায়)?


1
এটি কি প্রশ্নের উত্তর দেয়? নাকি এটাই কি কেবল পরামর্শ দেওয়ার চেষ্টা করা উচিত? উভয় ক্ষেত্রেই,
ভাড়াটি

1

আমরা খুব অনুরূপ পরিস্থিতির মুখোমুখি হয়েছি।

ক্রিয়াকলাপ 1 (খোলার) -> ক্রিয়াকলাপ 2 (পূর্বরূপ) -> ক্রিয়াকলাপ 3 (বিশদ)

ভুল "পিছনে চাপুন" প্রতিক্রিয়া

  • ক্রিয়াকলাপ 3-এ ডিভাইস ব্যাক প্রেসগুলিও ক্রিয়াকলাপ 2 বন্ধ করে দেবে।

আমি উপরে পোস্ট করা সমস্ত উত্তর চেক করেছি এবং সেগুলির কোনওটিই কাজ করে নি। ক্রিয়াকলাপ 2 এবং কার্যকলাপ 3 এর মধ্যে রূপান্তরের জন্য জাভা সিনট্যাক্সটি সঠিক হতে পর্যালোচনা করা হয়েছিল।

একটি তৃতীয় পক্ষের অ্যাপ্লিকেশন কল করার জন্য কোডিং থেকে টাটকা। একটি ক্রিয়াকলাপ দ্বারা আমরা কনফিগারেশন কোণটি তদন্ত করার সিদ্ধান্ত নিয়েছি - অবশেষে আমাদের সমস্যার মূল কারণ সনাক্ত করতে সক্ষম করে।

ব্যাপ্তি : ক্রিয়াকলাপ 2 কনফিগারেশন 2 (কলার)।

মূল কারণ :

android:launchMode="singleInstance"

সমাধান :

android:launchMode="singleTask"

দৃশ্যত এই "ফিরে টেপার সাথে" বিষয়ে singleInstance কলিং কার্যকলাপের সঙ্গে এক দিকে ক্রিয়াকলাপ প্রার্থনা বলে মনে করে যেহেতু singleTask হিসাবে এটি করা উচিত কাজ ফাংশন ফিরে টেপার উদ্দেশ্যে নিজস্ব পরিচয় যথেষ্ট থাকার প্রার্থনা কার্যকলাপের জন্য অনুমতি দেবে।


0
{ getApplicationContext.finish();   }

এই পদ্ধতিটি ব্যবহার করে দেখুন ..


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

0

এটি সম্ভবত আপনি কল () সমাপ্ত কল করছেন; ক্লিক বাটনের ইভেন্টে তাই মূল বোতামটি আপনি বোতামটি ক্লিক করার ঠিক পরে বন্ধ হয়ে যায় এবং আপনি যখন পরবর্তী ক্রিয়াকলাপ থেকে ফিরে আসেন তখন অ্যাপ্লিকেশনটি প্রস্থান করা হয় কারণ মূল কার্যকলাপটি ইতিমধ্যে বন্ধ রয়েছে এবং কোনও সক্রিয় ক্রিয়াকলাপ নেই।


0

আপনার ক্রিয়াকলাপের onCreate পদ্ধতিতে নিম্নলিখিত কোডটি লিখুন।

getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(true);

তারপরে আপনার ক্রিয়াকলাপের ওপশনস আইটেম নির্বাচিত পদ্ধতিটি নীচে ওভাররাইড করুন

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

এবং আপনি যেতে ভাল।


0

আপনার এটি আপনার মূল কার্যকলাপে ব্যবহার করতে হবে

 Intent intent = new Intent(context , yourActivity);

            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
            context.startActivity(intent);

পতাকাটি একাধিক কাজ শুরু করবে যা আপনার মেইনঅ্যাক্টিভিটি বজায় রাখবে, আপনি যখন এটি শেষ করেন তখন এটি অন্য ক্রিয়াকলাপটি হারাবে এবং আপনাকে মূল কর্মকাণ্ডে ফিরিয়ে আনবে

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