ক্রিয়াকলাপ.ফিনিশ () পদ্ধতিটি ঠিক কী করছে?


156

আমি কিছু সময়ের জন্য অ্যান্ড্রয়েড অ্যাপ্লিকেশনগুলি বিকাশ করছি এবং ক্রিয়াকলাপের জীবনচক্র এবং অ্যাপ্লিকেশনটির জীবনচক্র সম্পর্কে প্রচুর পোস্ট অনুসরণ করেছি।

আমি জানি যে Activity.finish()পদ্ধতিটি কোথাও কোথাও কল করার জন্য Activity.onDestroy(), এবং স্ট্যাক থেকে ক্রিয়াকলাপটি সরিয়ে ফেলা হয়েছে এবং আমি অনুমান করি যে এটি কোনওভাবে অপারেটিং সিস্টেম এবং আবর্জনা সংগ্রহকারীকে নির্দেশ করে যে তিনি "তার কৌশলটি করতে পারেন" এবং স্মৃতি মুক্ত করতে যখন এটি ভাল সময় পাবে। তাই ....

আমি এই পোস্টে এসেছি - কোন অ্যাপ্লিকেশনটি বন্ধ করে দেওয়া হচ্ছে? এবং মার্ক মারফি এর উত্তর পড়ুন।

finish()পদ্ধতিটি আসলে কী করে তা সম্পর্কে আমাকে কিছুটা বিভ্রান্ত করে তোলে ।

এমন কোন সুযোগ আছে যে আমি কল করব finish()এবং onDestroy()ডাকা হবে না?


উত্তর:


171

finish()কোনও ক্রিয়াকলাপে কল করার সময় , পদ্ধতিটি onDestroy()কার্যকর করা হয়। এই পদ্ধতিটি এগুলি করতে পারে:

  1. ক্রিয়াকলাপটি পরিচালনা করছে এমন কোনও ডায়ালগ খারিজ করুন।
  2. ক্রিয়াকলাপ পরিচালনা করছে এমন কোনও কার্সার বন্ধ করুন।
  3. যে কোনও মুক্ত অনুসন্ধান সংলাপ বন্ধ করুন

এছাড়াও, onDestroy()কোনও ধ্বংসকারী নয়। এটি আসলে বস্তুটিকে ধ্বংস করে না। এটি কেবল একটি পদ্ধতি যা নির্দিষ্ট রাজ্যের উপর ভিত্তি করে ডাকা হয়। সুতরাং আপনার ক্লাসটি এখনও বেঁচে আছে এবং খুব ভাল * সুপারক্লাসের onDestroy()রান এবং রিটার্নের পরে nd অ্যান্ড্রয়েড ব্যবহারকারী অ্যাপ্লিকেশনটি পুনরায় চালু করতে চায় এমন ক্ষেত্রে প্রক্রিয়াগুলি রাখে, এটি সূচনার পর্বটি দ্রুততর করে তোলে। প্রক্রিয়াটি কিছু করছে না এবং মেমোরিটিকে পুনরুদ্ধারের প্রয়োজন হলে প্রক্রিয়াটি মারা যাবে


5
সুতরাং () পদ্ধতিটি কেবল অনডাস্ট্রয়ে () এ কল ট্রিগার করতে পারে এবং এটিই কি?
তাল কানেল

9
হ্যাঁ, আপনি যদি ক্রিয়াকলাপে ফিরে আসেন অনক্রিট () কল করা হবে।
লুইস পেনা

9
সমাপ্ত () অনপস () এবং অন স্টপ () কেও কল করে?
sr09

36
আমি আবার পরীক্ষা করে দেখলাম যে অনপজ (), অনস্টপ () এবং অনডেষ্ট্রয়ে () সমস্ত আপনি কল করার পরে () কল করার পরে ডাকা হবে।
Sam003

5
@ লরেন্ট অনপজ () এবং অনটপ () সবসময় বলা হয় না। নীচের উত্তরে আমার পর্যবেক্ষণ দেখুন
প্রকাশ

77

আমার উত্তর @ কে_আন্নাশে 2 সেন্ট। আমি ফিনিস () পদ্ধতিতে একটি সাধারণ পরীক্ষা করেছি। ক্রিয়াকলাপের জীবন চক্রের গুরুত্বপূর্ণ কলব্যাক পদ্ধতি তালিকাভুক্ত

  1. অনক্রিট () এ কলিং ফিনিস (): অনক্রিট () -> অনডাস্ট্রয় ()
  2. অন ​​স্টার্ট () এ কলিং ফিনিস (): অনক্রিট () -> অন স্টার্ট () -> অনস্টপ () -> অনডস্ট্রয় ()
  3. অনারিউম () এ কলিং ফিনিস (): onCreate () -> onStart () -> onResume () -> onPause () -> onStop () -> onDestroy ()

আমি যেটি বলতে চাইছি তা হ'ল ফিনিশিং () এক্সিকিউটিভ করার সময় এর মধ্যে যে কোনও পদ্ধতির পাশাপাশি পদ্ধতির প্রতিরূপগুলি ডাকা হয়।

উদাহরণ:

 onCreate() counter part is onDestroy()
 onStart() counter part is onStop()
 onPause() counter part is onResume()

আপনি যদি থামার ভিতরে ফিনিস কল করেন? এটি অন স্টপ> অনডস্ট্রয় কল করবে?
২১

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

আমি নিজেই যাচাই করেছি যে এই উত্তরটি সঠিক।
শ্রীকান্ত করুণাঘাট

33

এছাড়াও লক্ষ্য করুন যে আপনি যদি একটি উদ্দেশ্য শেষে ফিনিস () কল করেন তবে আপনি "ব্যাক" বোতামটি দিয়ে আগের ক্রিয়াকলাপে ফিরে যেতে পারবেন না

startActivity(intent);
finish();

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

1
@ ফ্রেঞ্চসো মার্কেটি-স্টাসি আপনার ক্ষেত্রে অনব্যাকপ্রেসড () ওভাররাইড করা ভাল এবং ব্যবহারকারী যদি ফিরে না যান তবে এতে সুপার.অনব্যাকপ্রেসড () না কল করা ভাল।
পল

13

onDestroy()চূড়ান্ত পরিচ্ছন্নতার জন্য বোঝানো হয়েছে - আপনার নিজের থেকে তৈরি করা সংস্থানগুলি মুক্ত করা, ওপেন সংযোগ বন্ধ করা, পাঠক, লেখক ইত্যাদি। আপনি যদি এটিকে ওভাররাইড না করেন, সিস্টেম এটি যা করে তা করে।

অন্যদিকে, finish()কেবল সিস্টেমটিকে জানতে দিন যে প্রোগ্রামার বর্তমানটি Activityশেষ করতে চায় । এবং তাই, এটি কলonDestroy() পরে ।

লক্ষ্য করার মতো কিছু বিষয়:

এটা প্রয়োজনীয় নয় শুধুমাত্র একটি কল finish()ট্রিগার একটি কলে onDestroy()। না As যেমনটি আমরা জানি, অ্যান্ড্রয়েড সিস্টেম ক্রিয়াকলাপ Activityহ্রাস করতে মুক্ত হয় যদি মনে হয় যে বর্তমানের প্রয়োজনীয় সংস্থানগুলি রয়েছে যা মুক্তি দেওয়া দরকার।


1
আপনি লিখেছেন যে সমাপ্তি () ক্রিয়াকলাপটি শেষ করা দরকার সিস্টেমটিকে জানাতে। সুতরাং এটি "কর এক্স = সিস্টেমকে এক্স করতে বলুন" বলার মতো। সেকেন্ডের জিনিস: আপনার উত্তর থেকে মনে হচ্ছে এমন কোনও উপায় আছে যা আমি ফিনিস () কে কল করব এবং সিস্টেমটি সিদ্ধান্ত নেবে যে ডাস্ট্রয়ে () কল করবেন না? এটা কি সম্ভব?
তাল কানেল

আপনি প্রথম অংশ অধিকার পেয়েছেন। কলিং finish()সিস্টেমটি শেষ করতে বলছে Activity। আপনার কর বিবৃতিতে "এক্স" অংশটি "শেষ (ধ্বংস) করা Activity"। দ্বিতীয় অংশটি ভুল। আসলে, আমি একটি শব্দ মিস করেছি। আমি উত্তর সম্পাদনা করেছি। onDestroy()কেবল এটি দ্বারা ট্রিগার করা হয় না finish(), সিস্টেম এটি নিজস্ব হিসাবেও এটি কল করতে পারে।
কাজেকগে গারা

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

সমাপ্তির পরে (), এই ক্রিয়াকলাপের সমস্ত ভেরিয়েবলগুলি ধ্বংস হয়ে যাবে, তাই না? আমি আবার এই ক্রিয়াকলাপে ফিরে এলে সেগুলি আবার ঘোষিত হবে বা আরম্ভ হবে, তাই না?
সিবস জুয়াং

3
দ্রষ্টব্য: যদি সিস্টেমটি প্রক্রিয়াটিকে হত্যা করে তবে onDestroy কল করা যাবে না। বিকাশকারী.অ্যান্ড্রয়েড.
কেভিন লি

9

সমাপ্তি () পদ্ধতিটি বর্তমান ক্রিয়াকলাপটি ধ্বংস করবে। আপনি যখন ব্যবহারকারী ব্যাকটি বোতাম টিপেন তখন আপনি এই ক্রিয়াকলাপটি বারবার লোড করাতে চান না এমন ক্ষেত্রে আপনি এই পদ্ধতিটি ব্যবহার করতে পারেন। মূলত এটি ক্রেন্ট স্ট্যাক থেকে ক্রিয়াকলাপ সাফ করে ars


8

উপরোক্ত @rommex উত্তর ছাড়াও, আমি এটিও লক্ষ্য করেছি finish() ক্রিয়াকলাপ ধ্বংসকে সারি করে এবং এটি ক্রিয়াকলাপের অগ্রাধিকারের উপর নির্ভর করে।

আমি যদি finish()পরে ফোন করি তবে আমি onPause()দেখছি onStop()এবং andonDestroy() ততক্ষণে ফোন করে called

আমি যদি finish()পরে ফোন করি onStop(), দেখি নাonDestroy() 5 মিনিট পরে না।

আমার পর্যবেক্ষণ থেকে, দেখে মনে হচ্ছে ফিনিসটি সারিবদ্ধ হয়েছে এবং আমি যখন এটিটি adb shell dumpsys activity activitiesসেট করা হয়েছিল তখন তাকিয়েছিfinishing=true , তবে যেহেতু এটি আর অগ্রভাগে নেই, ধ্বংসের জন্য এটি অগ্রাধিকার পায়নি।

সংক্ষেপে, onDestroy()কখনও কল করার নিশ্চয়তা দেওয়া হয় না, তবে এটির ক্ষেত্রেও এটি বিলম্বিত হতে পারে।


5

বিভিন্ন উত্তর এবং নোট দাবি করছে যে সমাপ্তি () অনপস () এবং অনসটপ () এড়িয়ে যেতে পারে এবং অনডস্ট্রয় () সরাসরি চালায়। সত্য কথা বলতে গেলে, এ সম্পর্কে অ্যান্ড্রয়েড ডকুমেন্টেশন ( http://developer.android.com/references/android/app/Activity.html ) "সিস্টেমের দ্বারা ক্রিয়াকলাপ সমাপ্ত বা ধ্বংস হচ্ছে" নোট করে যেটি বেশ অস্পষ্ট তবে এটি প্রস্তাবিত হতে পারে সমাপ্তি () onDestroy () এ যেতে পারে।

জাভাডক অন ফিনিস () একইভাবে হতাশাব্যঞ্জক ( http://developer.android.com/references/android/app/Activity.html#finish () ) এবং শেষ করার প্রতিক্রিয়াতে কোন পদ্ধতি (গুলি) বলা হয় তা আসলে নোট করে না ()।

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

2170-2170/? D/LIFECYCLE_DEMO INSIDE: onCreate
2170-2170/? D/LIFECYCLE_DEMO INSIDE: onStart
2170-2170/? D/LIFECYCLE_DEMO INSIDE: onResume
2170-2170/? D/LIFECYCLE_DEMO User just clicked button to initiate finish() 
2170-2170/? D/LIFECYCLE_DEMO INSIDE: onPause
2170-2170/? D/LIFECYCLE_DEMO INSIDE: onStop 
2170-2170/? D/LIFECYCLE_DEMO INSIDE: onDestroy

package com.mvvg.apps.lifecycle;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.Toast;

public class AndroidLifecycle extends Activity {

    private static final String TAG = "LIFECYCLE_DEMO";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d(TAG, "INSIDE: onCreate");
        setContentView(R.layout.activity_main);
        LinearLayout layout = (LinearLayout) findViewById(R.id.myId);
        Button button = new Button(this);
        button.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View view) {
                Toast.makeText(AndroidLifecycle.this, "Initiating finish()",
                        Toast.LENGTH_SHORT).show();
                Log.d(TAG, "User just clicked button to initiate finish()");
                finish();
            }

        });

        layout.addView(button);
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.d(TAG, "INSIDE: onStart");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.d(TAG, "INSIDE: onStop");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d(TAG, "INSIDE: onDestroy");
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.d(TAG, "INSIDE: onPause");
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.d(TAG, "INSIDE: onResume");
    }

}

3

@ user3282164 মতে ভ্রমণ জীবনচক্র এটা মাধ্যমে যেতে হবে onPause()-> onStop()-> onDestroy()কলিং উপর finish()

ডায়াগ্রামটি onDestroy()সিস্টেম দ্বারা সৃষ্ট [ক্রিয়াকলাপ চালানো] থেকে [ ] অবধি কোনও সরল পথ প্রদর্শন করে না ।

অনস্টপ () ডকটি বলেছেন " নোট করুন যে এই পদ্ধতিটি কখনই ডাকা যাবে না , কম স্মৃতি পরিস্থিতিতে যেখানে সিস্টেমের পর্যাপ্ত মেমরি নেই যাতে আপনার কার্যকলাপের প্রক্রিয়াটি অনপস () পদ্ধতির পরে চালিত রাখতে পারে। "



2

আমার অধ্যয়নটি দেখায় যে finish()পদ্ধতিটি কিছুটা ধ্বংসাত্মক ক্রিয়াকে কাতারে রাখে তবে ক্রিয়াকলাপটি তত্ক্ষণাত ধ্বংস হয় না। ধ্বংস যদিও নির্ধারিত।

উদাহরণস্বরূপ, আপনি finish()যদি onActivityResult()কলব্যাকে রাখেন, যখন onResume()এখনও চালানো হয়নি, তবে প্রথমে onResume()কার্যকর করা হবে এবং কেবল তার পরে onStop()এবংonDestroy() ডাকা হবে।

দ্রষ্টব্য: ডকুমেন্টেশনেonDestroy() যেমন বলা হয়েছে তেমনভাবে ডাকা যাবে না ।


2

অনক্রিটে কলিং ফিনিস () @প্রকাশ যেমন বলেছেন ঠিক তেডস্ট্রয় () কে কল করবে না। দ্যfinish()অপারেশন এমনকি শুরু হবে না যতক্ষণ না আপনি অ্যান্ড্রয়েড নিয়ন্ত্রণ ফিরে যান।

অনক্রিট () এ কলিং ফিনিস () : onCreate () -> onStart () -> onResume () । যদি ব্যবহারকারী প্রস্থান করে তবে অ্যাপটি কল করতে হবে -> অনপজ () -> অনস্টপ () -> অনডস্ট্রয় ()

মধ্যে ফিনিস () কল করা হচ্ছে onStart () : onCreate () -> onStart () -> onStop () -> onDestroy ()

অনারেসিউমে () কলিং ফিনিস () : onCreate () -> onStart () -> onResume () -> onPause () -> onStop () -> onDestroy ()

এই সময়ে আরও রেফারেন্স চেক টি দেখতে ফিনিস পর onCreate একটানা & ফিনিস সম্পর্কে ()


0

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

সুতরাং আপনি যদি নিশ্চিত করতে চান যে আপনি ফিনিস () কল করার সময় কিছু কাজ হয়ে গেছে, আপনি এটি ডিস্ট্রোয় () এ রাখতে পারবেন না, তবে ঠিক যেখানে ফোন করার আগে আপনি ফিনিস () বলে ঠিক সেখানে ঠিক একই জায়গায় কাজ করতে হবে।


-4

সমাপ্তি () কেবলমাত্র অ্যান্ড্রয়েডের আগের ক্রিয়াকলাপে ফিরে পাঠায়, বা আপনি বলতে পারেন যে এটি প্রয়োগে এক ধাপ পিছিয়ে যাচ্ছে

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