অন্য ক্রিয়াকলাপ থেকে একটি ক্রিয়াকলাপ শেষ করুন


102

আমি অন্য ক্রিয়াকলাপ থেকে একটি ক্রিয়াকলাপ শেষ করতে চাই, যেমন:

ক্রিয়াকলাপ [এ] তে, বাটনে ক্লিক করুন, আমি ক্রিয়াকলাপ [এ] শেষ না করেই ক্রিয়াকলাপটিকে [বি] কল করছি।

ক্রিয়াকলাপ [বি] এ, নতুন এবং সংশোধন করুন দুটি বোতাম রয়েছে । ব্যবহারকারী যখন পরিবর্তিত ক্লিক করে তারপরে সমস্ত বিকল্পের টিক দিয়ে স্ট্যাক থেকে একটি ক্রিয়াকলাপ [এ] পপ করুন ..

কিন্তু যখন ব্যবহারকারী ক্রিয়াকলাপ [বি] থেকে নতুন বোতামে ক্লিক করেন , তখন আমাকে স্ট্যাক থেকে ক্রিয়াকলাপ [এ] শেষ করতে হবে এবং সেই ক্রিয়াকলাপ [এ ]টিকে আবার স্ট্যাকের মধ্যে পুনরায় লোড করতে হবে।

আমি এটি চেষ্টা করছি, তবে আমি স্ট্যাক থেকে কার্যকলাপ [এ] শেষ করতে সক্ষম নই ... আমি কীভাবে এটি করতে পারি?

আমি কোডটি এইভাবে ব্যবহার করছি:

ক্রিয়াকলাপ থেকে [এ]:

Intent GotoB = new Intent(A.this,B.class);
startActivityForResult(GotoB,1);

একই ক্রিয়াকলাপে অন্য একটি পদ্ধতি

public void onActivityResult(int requestCode, int resultCode, Intent intent) {

    if (requestCode == 1)
    {
        if (resultCode == 1) {
            Intent i = getIntent();
            overridePendingTransition(0, 0);
            i.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
            finish();

            overridePendingTransition(0, 0);
            startActivity(i);
        }
    }
}

এবং কার্যকলাপে [বি], বোতামে ক্লিক করুন:

setResult(1);
finish();

আরে, আপনি অন্য কার্যকলাপ থেকে একটি ক্রিয়াকলাপ শেষ করতে চেয়েছিলেন ... তবে আমি উত্তরটি পোস্ট করেছি যা সঠিক which তবে, আপনি কেন এটিকে ভোট দিয়েছিলেন?
মঞ্জুনাথ

কয়েকটি সুন্দর উত্তরের সাথে এখানে একটি থ্রেড রয়েছে: stackoverflow.com/questions/14355731/…
আবু

উত্তর:


188
  1. আপনার ক্রিয়াকলাপটিকে ম্যানিফেস্ট ফাইলে তৈরি করুন: launchMode = "singleInstance"

  2. যখন ব্যবহারকারী নতুন ক্লিক করেন, FirstActivity.fa.finish();তখন নতুন ইনটেন্টটি করুন এবং কল করুন।

  3. যখন ব্যবহারকারী ক্লিক ক্লিক করে সংশোধন করে, নতুন উদ্দিষ্টকে কল করুন বা কেবল ক্রিয়াকলাপ বি শেষ করুন B.

প্রথম উপায়

আপনার প্রথম ক্রিয়াকলাপে, এর Activity objectমতো একটি ঘোষণা করুন ,

public static Activity fa;
onCreate()
{
    fa = this;
}

Activityএই ধরণের প্রথম-ক্রিয়াকলাপ শেষ করতে এখন অন্যটিতে সেই অবজেক্টটি ব্যবহার করুন ,

onCreate()
{
    FirstActivity.fa.finish();
}

দ্বিতীয় উপায়

আপনার ক্রিয়াকলাপটি কল করার সময় FirstActivityযা আপনি এগিয়ে যাওয়ার সাথে সাথে শেষ করতে চান, আপনি কল করার সময় পতাকা যুক্ত করতে পারেনFirstActivity

intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);

তবে এই পতাকাটি ব্যবহার করে ক্রিয়াকলাপটি আপনি এটি না করতে চাইলেও সমাপ্ত হয়ে যাবে। এবং onBackযদি আপনি এটি প্রদর্শন করতে চান তবে আপনাকে FirstActivityএটিকে উদ্দেশ্য করে কল করতে হবে।


6
দুর্দান্ত উত্তর .. !!
বৈভব বজানী

94
আপনি কোনও ক্রিয়াকলাপের স্থিতিশীল রেফারেন্স ধারণ করছেন। আপনি কোথাও থেকে ম্যানুয়ালি সাফ না করা ছাড়া এটি কখনই দূরে যাবে না -> আপনি মেমরি ফাঁস তৈরি করছেন!
DArkO

5
ঠিক আছে ঠিক আছে, বাক্সের বাইরে চিন্তাভাবনার জন্য আপনার আমার +1 আছে: ডি, আমি কেবল সিঙ্গলটপে পরিবর্তন করব। অনুরূপ কিছু করার পরে অবশ্য এটি আমার প্রথম পছন্দ হবে না। ক্লিনআপ কোড দ্বারা আমি স্থির রেফারেন্স থেকে মুক্তি পাওয়ার উপায় বোঝাতে চাইছি যাতে কোনও মেমরি ফাঁস হয় না, তবে এটি অ্যাপ্লিকেশন কাঠামোর উপর নির্ভর করে।
DArkO

6
দয়া করে কেউ প্রথম সমাধানটি ব্যবহার করবেন না, এটি সম্পূর্ণ ভুল। আপনি একটি জম্বি অবজেক্ট তৈরি করার সময় অ্যান্ড্রয়েড ফ্রেমওয়ার্কটিকে সত্যই হ্যাকি উপায়ে বাইপাস করছেন। একটি ব্রডকাস্টআরসিভার ব্যবহার করুন।
এস-কে '

4
দুর্দান্ত সমাধান আমার সমস্যার জন্য আমি খুব ভাল কাজ করেছিলাম যেখানে আমি ক্রিয়াকলাপগুলি এ-> বি-> সি থেকে শুরু করেছিলাম এবং সি এর অনব্যাকপ্রেসডে, আমি বি এর নতুন উদাহরণ চালু করছিলাম তবে আমি যদি বি এর নতুন উদাহরণটিতে অনব্যাকপ্রেস করতাম তবে এটি ব্যবহৃত হত এ এর পুরানো উদাহরণের পরিবর্তে বি এর পুরানো দৃষ্টান্তে যান (আমি যা চেয়েছিলাম)। তাই আমি সি এর অনব্যাকপ্রেসে আপনার প্রথম পদ্ধতিটি অনুসরণ করেছি এবং এটি আমাকে যে আচরণটি চেয়েছিল তা দিয়েছিল :) ধন্যবাদ একটি টন :)
সোলরয়েডার

89

এটি আপনি করতে পারেন তবে আমার মনে হয় আপনার ক্রিয়াকলাপের স্বাভাবিক প্রবাহটি ভঙ্গ করা উচিত নয়। আপনি যদি আপনার ক্রিয়াকলাপ শেষ করতে চান তবে আপনি কেবল আপনার কার্যকলাপ বি থেকে ক্রিয়াকলাপ এ তে একটি সম্প্রচার পাঠাতে পারেন send

আপনার ক্রিয়াকলাপ শুরু করার আগে একটি সম্প্রচারক রিসিভার তৈরি করুন বি:

BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {

    @Override
    public void onReceive(Context arg0, Intent intent) {
        String action = intent.getAction();
        if (action.equals("finish_activity")) {
            finish();
            // DO WHATEVER YOU WANT.
        }
    }
};
registerReceiver(broadcastReceiver, new IntentFilter("finish_activity"));

ক্রিয়াকলাপ বি থেকে ক্রিয়াকলাপ A তে সম্প্রচার প্রেরণ করুন যখন আপনি বি থেকে ক্রিয়াকলাপ A শেষ করতে চান

Intent intent = new Intent("finish_activity");
sendBroadcast(intent);

আমি আশা করি এটি আপনার পক্ষে কাজ করবে ...


এটি এই ত্রুটিটি দেখায় "টোকেনগুলিতে সিনট্যাক্স ত্রুটি, এনজিটেশননাম পরিবর্তে" অন "রেজিস্ট্রার রিসিভার (সম্প্রচার_আরসিভার, নতুন ইনটেন্টফিল্টার (" ফিনিস_একটিভিটি ")) প্রত্যাশিত;"; কোনো সমস্যা?
বেহজাদ

4
"আপনার ক্রিয়াকলাপের স্বাভাবিক প্রবাহ ভাঙা উচিত নয়" +1
এস-কে '

12
broadcast_receiverসাথে নিবন্ধন করতে ভুলবেন নাunregisterReceiver()
Jaec


এটিই সমাধান। একটি দুর্দান্ত
পরিিন্দা রাজাপক্ষ

17

এটি মোটামুটি স্ট্যান্ডার্ড যোগাযোগের প্রশ্ন। একটি পদ্ধতির ক্রিয়াকলাপ এ এর ​​ফলাফল ফলাফল গ্রহণ করা হবে:

Intent GotoB=new Intent(A.this,B.class);
GotoB.putExtra("finisher", new ResultReceiver(null) {
    @Override
    protected void onReceiveResult(int resultCode, Bundle resultData) {
        A.this.finish();
    }
});
startActivityForResult(GotoB,1);

এবং তারপরে ক্রিয়াকলাপ বি তে আপনি ঠিক তেমন চাহিদা অনুযায়ী শেষ করতে পারেন:

((ResultReceiver)getIntent().getExtra("finisher")).send(1, new Bundle());

এরকম কিছু চেষ্টা করুন।


6
+1 কেবল, ((রেজাল্ট রিসিভার) getIntent ()। GetParcelableExtra ("সমাপ্তি")) প্রেরণ করুন (1, নতুন বান্ডেল ());
হামিদ্রেজা সাদেগে

12

আপনি আপনার ক্ষেত্রে ব্যবহার করতে পারেন যে একটি পদ্ধতির আছে।

পদক্ষেপ 1: ক্রিয়াকলাপ এ থেকে ক্রিয়াকলাপ বি শুরু করুন

startActivity(new Intent(A.this, B.class));

পদক্ষেপ 2: ব্যবহারকারী পরিবর্তিত বোতামে ক্লিক করে কার্যকলাপ এ ব্যবহার করে ক্রিয়াকলাপ এ শুরু করে Aএছাড়া FLAG_ACTIVITY_CLEAR_TOP, অতিরিক্ত পতাকাটি পাস করুন।

Intent i = new Intent(B.this, A.class);
i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
i.putExtra("flag", "modify");
startActivity(i);
finish();

স্টিপি 3: যদি ব্যবহারকারী অ্যাড বাটনে ক্লিক করেন তবে কার্যকলাপ এ ব্যবহার করে ক্রিয়াকলাপ এ শুরু করুন FLAG_ACTIVITY_CLEAR_TOPl এছাড়াও, অতিরিক্তটিতে পতাকাটি পাস করুন। FLAG_ACTIVITY_CLEAR_TOPলক্ষ্য ক্রিয়াকলাপে কোনও লঞ্চ মোড সংজ্ঞায়িত না করা থাকলে লক্ষ্য পর্যন্ত সমস্ত খোলা ক্রিয়াকলাপ সাফ করে দেবে এবং পুনরায় চালু হবে

Intent i = new Intent(B.this, A.class);
i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
i.putExtra("flag", "add");
startActivity(i);
finish();

পদক্ষেপ 4: এখন onCreate()ক্রিয়াকলাপ A এর পদ্ধতিটি, সেই পতাকাটি পুনরুদ্ধার করা দরকার।

String flag = getIntent().getStringExtra("flag");
if(flag.equals("add")) {
    //Write a code for add
}else {
    //Write a code for modifying
}


5

স্ট্যাক ওভারফ্লো প্রশ্নের আমার উত্তরটি দেখুন সমস্ত পূর্ববর্তী সমস্ত ক্রিয়াকলাপ শেষ করুন

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

আর একটি জিনিস যা আপনার প্রয়োজন তা হ'ল SINGLE_TOPপতাকা। ইতিমধ্যে স্ট্যাকটিতে এমন কোনও তৈরি করা থাকলে আপনি এটিকে অ্যান্ড্রয়েডকে একটি নতুন ক্রিয়াকলাপ তৈরি করা থেকে বিরত রাখেন।

কেবল সতর্ক থাকুন যে যদি ক্রিয়াকলাপটি ইতিমধ্যে তৈরি করা হয়েছিল, তবে লক্ষ্যগুলি ক্রিয়াকলাপে এই পতাকাগুলির সাথে অভিপ্রায়টি ডাকা হবে onNewIntent(intent)(আপনার এটি হ্যান্ডেল করার জন্য এটি ওভারলোড করা প্রয়োজন) নামক পদ্ধতিতে সরবরাহ করা হবে ।

তারপরে আপনার মধ্যে onNewIntentপুনঃসূচনা বা এমন কিছু আছে যা কল finish()করে নিজের দিকে নতুন অভিপ্রায় repopulate()আনবে , বা এমন একটি পদ্ধতি রয়েছে যা নতুন ডেটা সেট করবে। আমি দ্বিতীয় পদ্ধতির পছন্দ করি, এটি কম ব্যয়বহুল এবং আপনি সর্বদা onCreateযুক্তিটি একটি পৃথক পদ্ধতিতে এক্সট্রাক্ট করতে পারেন যা আপনি কল্পনা করতে পারেন।


4

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

আপনার খণ্ডে

// sending intent to onNewIntent() of MainActivity
Intent intent = new Intent(getActivity(), MainActivity.class);
intent.putExtra("transparent_nav_changed", true);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

এবং আপনার পুনর্সূচনা করতে চাইলে ক্রিয়াকলাপের আপনার অননইউন্টেন্ট () এর কাছে।

// recreate activity when transparent_nav was just changed
if (getIntent().getBooleanExtra("transparent_nav_changed", false)) {
    finish(); // finish and create a new Instance
    Intent restarter = new Intent(MainActivity.this, MainActivity.class);
    startActivity(restarter);
}

2

আমি মনে করি আমার কাছে সবচেয়ে সহজ পদ্ধতি আছে ... বি তে নতুন টিপতে ...

Intent intent = new Intent(B.this, A.class);
intent.putExtra("NewClicked", true);
 intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

এবং একটি এ এটি পেতে

  if (getIntent().getBooleanExtra("NewClicked", false)) {
        finish();// finish yourself and make a create a new Instance of yours.
      Intent intent = new Intent(A.this,A.class);
      startActivity(intent);
    }

1

আমি জানি এটি একটি পুরানো প্রশ্ন, এই পদ্ধতিগুলির কয়েকটি আমার পক্ষে কাজ করে নি তাই ভবিষ্যতের দিকে তাকিয়ে থাকা বা আমার সমস্যায় পড়তে পারে এমন কারও জন্য এটি আমার জন্য কাজ করে

আমি ওভাররড করেছিলাম onPauseএবং finish()সেই পদ্ধতির ভিতরে ডাকলাম called


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