অ্যান্ড্রয়েড অ্যাক্টিভিটিসের অনপস () এবং অনটপ () এর মধ্যে পার্থক্য কী?


149

এখানে অ্যান্ড্রয়েড ডক থেকে http://developer.android.com/references/android/app/Activity.html এ বলেছে যে 'ক্রিয়াকলাপটি অগ্রভাগে আসে' কল করবে onPause()এবং 'ক্রিয়াকলাপটি আর দৃশ্যমান নয়' কল করবে onStop()

'ক্রিয়াকলাপটি অগ্রভাগে আসে না' এর মতো 'ক্রিয়াকলাপটি আর দেখা যায় না'? আপনি দয়া করে বলতে পারেন যে তাদের মধ্যে পার্থক্য কী?


17
একটি দুর্দান্ত প্রশ্নের জন্য +1। এছাড়াও, একটি pausedক্রিয়াকলাপ সম্পূর্ণ জীবিত (এটি সমস্ত রাজ্য এবং সদস্যের তথ্য বজায় রাখে এবং উইন্ডো ম্যানেজারের সাথে সংযুক্ত থাকে)। একটি stoppedক্রিয়াকলাপ সমস্ত রাজ্য এবং সদস্যের তথ্য ধরে রাখে, তবে আর এর সাথে সংযুক্ত থাকে না window manager
এটিওব

উত্তর:


107

না, যদি কিছু কার্যকলাপ অগ্রভাগে আসে তবে এর অর্থ এই নয় যে অন্য ক্রিয়াকলাপটি সম্পূর্ণ অদৃশ্য। নিম্নলিখিত বিষয় বিবেচনা করুন:

থিম.ডায়ালগ সহ কার্যকলাপ Ac

এখানে আমরা একই সাথে উভয় ক্রিয়াকলাপ দেখি। ক্ষেত্রগুলির সাথে প্রথম ক্রিয়াকলাপ অন্য ক্রিয়াকলাপ দ্বারা অস্পষ্ট and এবং ব্যবহারকারী আর এটির সাথে ইন্টারঅ্যাক্ট করতে পারবেন না। তবে এটি এখনও সমস্ত ফলাফলের সাথে দৃশ্যমান।

এটি এমন একটি প্রশ্ন ফেলে যা কোন ক্রিয়াকলাপটিকে পুরোপুরি অস্বচ্ছ বলে মনে করা হয় এবং পুরো স্ক্রিনটি coveringেকে দেয় এবং কোনটি নয়। এই সিদ্ধান্তটি ক্রিয়াকলাপযুক্ত উইন্ডোর উপর ভিত্তি করে। যদি উইন্ডোটিতে একটি পতাকা থাকে windowIsFloatingবা windowIsTranslucent, তবে এটি বিবেচনা করা হয় যে ক্রিয়াকলাপটি অন্তর্নিহিত স্টাফগুলি অদৃশ্য করে না, অন্যথায় এটি করে এবং onStop()ডেকে আনে । সম্পর্কিত কোড পাওয়া যাবে com.android.server.am.ActivityRecord:

fullscreen = ent != null && !ent.array.getBoolean(
        com.android.internal.R.styleable.Window_windowIsFloating, false)
        && !ent.array.getBoolean(
        com.android.internal.R.styleable.Window_windowIsTranslucent, false);

10
আংশিক বনাম মোট (মোট) দৃশ্যমানতার দিকে মনোনিবেশ করে দুর্দান্ত ব্যাখ্যার জন্য +1। স্ক্রিনের প্রান্তিক শতাংশ জানার জন্য আকর্ষণীয় হবে যা অ্যান্ড্রয়েডকে onPause()এবং এর মধ্যে সিদ্ধান্ত নেয় onStop()। এটা কি 100%? পূর্ববর্তী ক্রিয়াকলাপ থেকে যদি কেবল একটি পিক্সেল দৃশ্যমান হয়, তা কি এখনও আছে onPause()?
এটিওব

3
@ateiob এটি কোথাও বলা হয় নি, তবে আমারও তাই মনে হয়। তবে এটি সাধারণত সুস্পষ্ট কারণ বেশিরভাগ ক্রিয়াকলাপ যা পুরো স্ক্রিনটি পূরণ করে না সেগুলি ডায়ালগগুলির জন্য সিস্টেম সরবরাহিত স্টাইলগুলির মধ্যে একটিতে ব্যবহার করে।
ম্যালকম

1
অদ্ভুত, তবে আমার অ্যাপ্লিকেশনটিতে onPause()ডায়ালগ প্রদর্শিত হওয়ার পরে একেবারেই ডাকা হয় না। onPause()যখন আমি হোম বোতাম টিপব তখনই ডাকা হয় । এটা কিভাবে সম্ভব?
ateiob

এটি সঠিক উত্তর হওয়া উচিত। যাইহোক, সম্মুখভাগ জিনিসটি কোনও সংলাপ বা ক্রিয়াকলাপ?
জিএমএসএফ

3
@GMsoF একটি ক্রিয়াকলাপ। এটি মূল বিষয়: প্রতিটি ডায়ালগ আসলে সংলাপ হয় না। আপনি কোনও ক্রিয়াকলাপকে ডায়ালগের মতো দেখতে পারেন, তাই এটি আসলে পুরো স্ক্রিনের চেয়ে ছোট।
ম্যালকম

38

আপনি যদি এখনও এর কোনও অংশ দেখতে পান ( Activityঅগ্রভাগে আসা পুরো পর্দাটি দখল করে না, বা এটি কিছুটা স্বচ্ছ), onPause()তাকে ডাকা হবে। আপনি যদি এর কোনও অংশ দেখতে না পান onStop()তবে ডাকা হবে।

উদাহরণস্বরূপ, একটি কথোপকথন ** পুরো পূর্বের অংশটি না .েকে Activityদিতে পারে এবং ডাকার জন্য onPause()এটি সময় হবে।

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


33
কোন। এটি বিভ্রান্তিকর। প্রদর্শিত একটি কথোপকথন পজ () কল করবে না কারণ ডায়ালগটি বর্তমান ক্রিয়াকলাপের প্রসঙ্গ ব্যবহার করে, ক্রিয়াকলাপটিকে জীবন্ত বিবেচনা করে।
জিএমএসএফ

6
@ জিএমএসএফ শুনে মনে হচ্ছে আমি যখন ডায়লগটি বলছিলাম, আপনি ভেবেছিলেন আমার বোঝানো হয়েছে Dialog, যেমন অ্যান্ড্রয়েড ক্লাসের মতো। আমি যা পেয়েছিলাম তা হ'ল এমন কিছু যা Activityএই ধারণাটিকে চিত্রিত করার জন্য আংশিকভাবে প্রথমে অস্পষ্ট করে দেয় যে সমস্ত নতুনের Activityপুরোপুরি পুরোপুরি আবরণ প্রয়োজন নেই।
নিকোলাস.হসচিল্ড

11

অগ্রভাগে থাকার অর্থ এই ক্রিয়াকলাপটির ইনপুট ফোকাস রয়েছে। উদাহরণস্বরূপ, একটি ক্রিয়াকলাপ দৃশ্যমান হতে পারে তবে ফোকাস রয়েছে এমন একটি ডায়ালগ দ্বারা আংশিকভাবে অস্পষ্ট। সেক্ষেত্রে onPause()ডাকা হবে, তবে হবে না onStop()। কথোপকথনটি সরে গেলে, ক্রিয়াকলাপের onResume()পদ্ধতিটি কল করা হবে (তবে তা নয় onStart())।


5
কথোপকথনটি বিভ্রান্তিকর হতে পারে। আসুন এই ক্রিয়াকলাপের প্রধান UI থ্রেড থেকে একটি সতর্কতা ডায়ালগ পপ আপ করা উচিত, অনপস () এই ক্ষেত্রে ডাকা হবে না। এই ডায়ালগটি কেবলমাত্র অন্য ক্রিয়াকলাপ বা অন্যান্য অ্যাপ্লিকেশন থেকে পপ আপ করা হয়।
Sam003

1
@ জিশেং - আমি আপনার মন্তব্যের সাথে একমত আমি কেবল অ্যাক্টিভিট গাইডের বিষয়টিই প্যারাফ্রেস করছিলাম : " onPause()যখন ডিভাইসটি ঘুমাতে যায় বা ডায়ালগ প্রদর্শিত হয় তখন তাকে ডাকা হয়" । যেহেতু এই থ্রেড স্পষ্ট করে তোলে, যদিও, একটি ডায়ালগ নেই অগত্যা মানে একটি কার্যকলাপ বিরাম দেওয়া হয়েছে (যদিও এটা, বলে, একটি হবে কার্যকলাপকে ডায়ালগ হিসাবে দেখানো )।
টেড হপ

9

ব্যবহারিকভাবে , "অনপজ ()" এবং "অনপজ () + অনস্টপ ()" এর মধ্যে পার্থক্যটি বিবেচনা করা উচিত

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

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

সংক্ষিপ্তসার-

অনপজ () - স্ক্রিন আংশিকভাবে অন্যান্য নতুন ক্রিয়াকলাপ দ্বারা আচ্ছাদিত। ক্রিয়াকলাপটি ব্যাক স্ট্যাকে সরানো হয়নি।

অনপজ () + অনস্টপ () - স্ক্রিনটি অন্যান্য নতুন ক্রিয়াকলাপের সাথে পুরোপুরি covered েকে যায় । ক্রিয়াকলাপটি ব্যাক স্ট্যাকে স্থানান্তরিত হয়।

পিছনে স্ট্যাক সম্পর্কে আরও জানুন ।


0

সংক্ষিপ্ত কথায়:

onStop()পূর্ববর্তী ক্রিয়াকলাপের জীবনচক্র পদ্ধতিটি চাওয়া হয় যখন অন্য ক্রিয়াকলাপ দেখানো হয়। আপনার ক্রিয়াকলাপের শীর্ষে যখন ডায়লগ থাকে, তখন সেখানে অনুরোধ onPause()করা হয়।

দ্রষ্টব্য : ক্রিয়াকলাপগুলি হ'ল উপাদানগুলি যা আপনার পুরো স্ক্রীন পূরণ করে।

দ্রষ্টব্য : ডায়ালগগুলি পুরোপুরি স্ক্রিনটি পূরণ না করায় ক্রিয়াকলাপ নয়।


0

অনপস এবং অনটপ পদ্ধতিগুলির সাথে আমি অনেক সমস্যার মুখোমুখি হয়েছি এবং সেজন্য আমি তিনটি দৃশ্যাবলী সাফ করে দেব যা আমি পেরেছি -
১. আপনি যখন সাম্প্রতিক অ্যাপ্লিকেশন বোতামটিতে ক্লিক করেন, তখন লাইফ চক্র পদ্ধতিটি বলা হয় না তবে হ্যান্ডফোকাস মান সহ উইন্ডোফোকাস চ্যাঞ্জড (বুলেটিয়ান হসফোকাস) বলা হয় মিথ্যা হিসাবে পাস 5 এর আগে অ্যান্ড্রয়েড সংস্করণে, সাম্প্রতিক অ্যাপ্লিকেশন বোতাম টিপে টিপতে কল করার জন্য অনপেজ পদ্ধতিটি ব্যবহৃত হয়েছিল।

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

3।যদি আপনার ক্রিয়াকলাপটি স্ক্রিনের সময় শেষ হয়ে যায়, তবে অনপেজ বলা হয়। কিছুক্ষণ পরে যদি আপনি স্ক্রিনটি না খোলেন তবে অনস্টপ কল হবে।

এটিওব দ্বারা উল্লিখিত একটি গুরুত্বপূর্ণ বিষয় যা উত্তরটি সম্পূর্ণ করে

একটি বিরতি দেওয়া ক্রিয়াকলাপ সম্পূর্ণ জীবন্ত (এটি সমস্ত রাজ্য এবং সদস্যের তথ্য বজায় রাখে এবং উইন্ডো ম্যানেজারের সাথে সংযুক্ত থাকে)। একটি থামানো ক্রিয়াকলাপ সমস্ত রাজ্য এবং সদস্যের তথ্য ধরে রাখে, তবে উইন্ডো ম্যানেজারের সাথে আর সংযুক্ত থাকে না


আশা করি এটা সাহায্য করবে.


0

যখনই কোনও নতুন ক্রিয়াকলাপ শুরু হয় পূর্ববর্তী ক্রিয়াকলাপটি যে onPauseকোনও পরিস্থিতিতে ত্রুটিযুক্তভাবে ডাকা হবে।

আসলে দুটি পরিস্থিতি থাকবে:

1- পূর্ববর্তী ক্রিয়াকলাপের একটি অংশ দৃশ্যমান বা নতুন ক্রিয়াকলাপটি স্বচ্ছ: কেবলমাত্র কল করা onPauseহবে।

2- পূর্ববর্তী ক্রিয়াকলাপ সম্পূর্ণ নতুন ক্রিয়াকলাপ দ্বারা আচ্ছাদিত: উভয়ই onPauseএবং কল করা onStopহবে

---- কিছু নোট বলা ভাল:

দ্রষ্টব্য 1: যদি কোনও ক্রিয়াকলাপের শীর্ষে কোনও ডায়ালগ শুরু হয় onPauseবা কল করা onStopহবে না।

দ্রষ্টব্য 2: এটির কোনও ক্রিয়াকলাপ যদি এর থিমটি একটি কথোপকথনে সেট করা থাকে তবে আচরণটি একটি সাধারণ ক্রিয়াকলাপের মতো হবে।

দ্রষ্টব্য 3: দৃশ্যত অনুমতি ডায়ালগের মতো একটি সিস্টেম ডায়ালগ যেহেতু মার্শমেলো তৈরি করবে onPause


-5

ইয়াপ, আমি বুঝতে চেষ্টা করি এবং আমি এটি নীচে ব্যাখ্যা করতে পারি:

দুটি ক্রিয়াকলাপ রয়েছে: অ্যাক্টিভিটিএ এবং অ্যাক্টিভিটিবি

public class ActivityA extends Activity implements OnClickListener {

// button
private Button mBtnChangeActivity;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_a);
    initialize();
    setEvent();
}

private void initialize() {
    Log.i("Activity A", "Initialize()");
    mBtnChangeActivity = (Button) findViewById(R.id.btn_change_activity);
}

private void setEvent() {
    Log.i("Activity A", "setEvent()");
    mBtnChangeActivity.setOnClickListener(this);
}

@Override
protected void onStart() {
    super.onStart();
    Log.i("Activity A", "onStart");
}

@Override
protected void onResume() {
    super.onResume();
    Log.i("Activity A", "onResume");
}

@Override
protected void onPause() {
    super.onPause();
    Log.i("Activity A", "onPause");
}

@Override
protected void onStop() {
    super.onStop();
    Log.i("Activity A", "onStop");
}

@Override
protected void onDestroy() {
    super.onDestroy();
    Log.i("Activity A", "onDestroy");
}

@Override
public void onClick(View v) {
    switch (v.getId()) {
    case R.id.btn_change_activity:
        Intent activityB = new Intent(this, ActivityB.class);
        startActivity(activityB);
        break;
    default:
        break;
    }
}

এখানে কার্যকলাপ বি। কোডে আমার মন্তব্য অনুসরণ করুন

public class ActivityB extends Activity implements OnClickListener {

// button
private Button mBtnChangeActivity;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_a);
    initialize();
    setEvent();
    // if call finish() here, activityA will don't stop, just pause
    // Activity A will call onStop() when Activity B call onStart() method
    finish();
}

private void initialize() {
    Log.i("Activity B", "Initialize()");
    mBtnChangeActivity = (Button) findViewById(R.id.btn_change_activity);
}

private void setEvent() {
    Log.i("Activity B", "setEvent()");
    mBtnChangeActivity.setOnClickListener(this);
}

@Override
protected void onStart() {
    super.onStart();
    Log.i("Activity B", "onStart");
}

@Override
protected void onResume() {
    super.onResume();
    Log.i("Activity B", "onResume");
}


@Override
public void onClick(View v) {
    switch (v.getId()) {
    case R.id.btn_change_activity:
        finish();
        break;
    default:
        break;
    }
}
}

আমি আশা করি এটি পরিষ্কারভাবে আছে


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