অ্যান্ড্রয়েডে ক্রিয়াকলাপ পুনরায় লোড করুন


220

এটি একটি পুনরায় লোড করার একটি ভাল অনুশীলন Activityমধ্যে অ্যান্ড্রয়েড ?

এটি করার সর্বোত্তম উপায় কী হবে? this.finishএবং তারপর this.startActivityকার্যকলাপের সাথে Intent?


3
আমি একজন অভিজ্ঞ অ্যান্ড্রয়েড বিকাশকারী নই, তবে কোনও কার্যকলাপ পুনরায় চালু করা দুর্বল ডিজাইনের মতো মনে হচ্ছে এবং কেবলমাত্র চরম ক্ষেত্রেই করা উচিত।
হাডসন

@ হাডসন কনফিগারেশন পরিবর্তনের ক্ষেত্রে যা ঘটে তা ঘটে। যদি এটি ভাল ডিজাইন হয় বা না হয় তবে এটি সম্পূর্ণরূপে অন্য একটি আলোচনা। ;)
এইচপিক

1
@ হাডসন তাই আপনার এখন অভিজ্ঞতা বিকাশকারী 5 বছর: ডি
প্রতীক বুটানী

@ প্রকটিক বুটানি, আমি কি আপনাকে চিনি? :) আমার এখন 8 বছরের অভিজ্ঞতা আছে তবে অ্যান্ড্রয়েড বিকাশের মধ্যে খুব বেশি নয়।
হাডসন

আপনি আমার প্রোফাইলটি পরিদর্শন করেছেন আমি জানি: পি @ হাডসন
প্রতীক

উত্তর:


521

আপনি সহজভাবে ব্যবহার করতে পারেন

finish();
startActivity(getIntent());

Activityনিজের মধ্যে থেকে একটি রিফ্রেশ


2
যদি ক্রিয়াকলাপ শ্রেণীর ভিতরে এটি বলা যায় না ?, প্রসঙ্গের রেফারেন্স সহ এটি করার কোনও উপায়?
জিওরজিলাইন

1
@ জিওরগিলাইন - হ্যাঁ, আপনি একটি ক্রিয়াকলাপ শ্রেণীর অভ্যন্তরে যে সংজ্ঞাটি দিয়েছিলেন সেগুলি তৈরি করুন এবং আপনি যে বাহ্যিক শ্রেণীর ব্যবহার করছেন তা থেকে এই ইন্টারফেসটিকে প্যারামিটার হিসাবে পাস করুন।
সামগ্রিক

1
বাহ, আমি ভাবিনি যে এটি এত সহজ হবে।
theblang

1
ফলাফলের জন্য শুরু করা কোনও কার্যকলাপের সাথে আপনি কীভাবে ডিল করতে পারেন? আপনি কি আসল কলারটির সাথে এখনও কোনও ফলাফল পাওয়ার সাথে সাথে এটি পুনরায় চালু করতে পারেন?
টথফু

1
@ টথফু - যদিও চেষ্টা করা হয়নি তবে তাত্ত্বিকভাবে আমি হ্যাঁ মনে করি। তবে দ্বিতীয়বার ক্রিয়াকলাপটি শেষ হয়ে গেলে, এটি প্রথমবারের মতো তৈরি করা ক্রিয়াকলাপে ফলাফল ফিরিয়ে দেবে না।
সুশ

64

যারা পুনরায় তৈরির () পদ্ধতিটি সহজেই ব্যবহার করার পরে এই ঝলক দেখতে চান না তাদের জন্য

 finish();
 overridePendingTransition(0, 0);
 startActivity(getIntent());
 overridePendingTransition(0, 0);

2
অসাধারণ! আমি ট্রানজিশনটি ওভাররাইড করতে চেয়েছিলাম যাতে ব্যবহারকারীর নজরে না আসে!
সিডি মুহোজা

দারূন কাজ! ব্যবহারকারী সবে পুনরায় লোড লক্ষ্য করবেন।
স্যাম

38

অগ্রাধিকার পরিবর্তন থেকে ফিরে আসার পরে ক্রিয়াকলাপটি পুনরায় লোড করতে আমি এটিই করি।

@Override
protected void onResume() {

   super.onResume();
   this.onCreate(null);
}

এটি মূলত ক্রিয়াকলাপটি পুনরায় চিত্রিত করে।

আপডেট করা: এটি করার একটি আরও ভাল উপায় হল recreate()পদ্ধতিটি কল করা । এর ফলে ক্রিয়াকলাপটি পুনরায় তৈরি করা হবে।


15
এটি সম্ভবত কাজ করছে তবে স্পষ্টতই লাইফসাইकल পদ্ধতিগুলিকে কল করার জন্য দৃ strongly়ভাবে সুপারিশ করা হয়নি।
আইটিশা

আপনি যদি এই রুটটি নিয়ে যান তবে আপনার পৃথক init () পদ্ধতি ব্যবহার করা উচিত যা সমস্ত কিছু সেট আপ করে এবং অনক্রিট () এবং অনরেউসুম () এর মধ্যে কল করে ওনক্রিট () পরিবর্তে কল করে।
টম

1
আপনার জীবনচক্র পদ্ধতিগুলি অন্যান্য জিনিসের জন্য ব্যবহার করা হয় তবে কিছু পরিস্থিতিতে কার্যকর না হয়ে দুর্দান্ত সমাধান। উদাহরণস্বরূপ, আমি ফোনের ক্যামেরাটি অ্যাক্সেস করছি এবং যখন ছবিটি নেওয়া হবে তখন স্ক্রিনটি এটিকে একটি দৃশ্যে পোস্ট করার জন্য আমার ক্রিয়াকলাপে ফিরে আসে। রিফ্রেশ করার জন্য লাইফসাইकल পদ্ধতি ব্যবহার করে, আমি ক্যামেরা প্রক্রিয়া থেকে সরিয়ে আনি এবং আমার ফটো ক্রিয়াকলাপে ফিরে আসে না, বরং আমি শুরু থেকেই ক্রিয়াকলাপটি পাই। সচেতন হওয়ার জন্য কেবল একটি উদাহরণ।
আজুরস্পট 4

1
পুনরায় তৈরি () ব্যবহার করার সময় ক্রিয়াকলাপের লঞ্চমোডটি বিবেচনা করা গুরুত্বপূর্ণ। উদাহরণস্বরূপ, যখন আমি লঞ্চমোড = সিঙ্গেলপ সহ কোনও ক্রিয়াকলাপে () পুনঃসেট করা কল করি, তখন আমি অনক্রিট () পরে কল করা দেখি না। ওটিওহ, যদি, পুনরায় তৈরি () কল করার পরিবর্তে, আমি স্পষ্টতই ফিনিস () বলা এবং তারপরে startActivity () অনুসরণ করি তবে আমি দেখতে পাই যে অনক্রিট () পরে ডাকা হবে।
অ্যালবার্ট সি ব্রাউন

14

আমি পূর্ববর্তী উত্তরগুলি দেখেছি যা ইনটেন্ট ব্যবহার করে ক্রিয়াকলাপটি পুনরায় লোড করার জন্য দেওয়া হয়েছে। এগুলি কাজ করবে তবে আপনি ক্রিয়াকলাপ শ্রেণিতে দেওয়া পুনরায় তৈরি () পদ্ধতিটি ব্যবহার করে একই কাজ করতে পারেন।

পরিবর্তে এটি লেখার

// ডায়লগ বাক্স বন্ধ হয়ে গেলে মূল ক্রিয়াকলাপটি রিফ্রেশ করুন

Intent refresh = new Intent(this, clsMainUIActivity.class);
startActivity(refresh);
this.finish();

এটি কেবল এটি লেখার মাধ্যমে করা যেতে পারে

recreate();

recreate()আমার জন্য সমাধান ছিল - "পুনরায় চালু করা" কার্যকলাপটি আমার পক্ষে কাজ করে না, কারণ আমি "স্টার্টএক্টিভিটি ফর রিসাল্ট" ব্যবহার করে ক্রিয়াকলাপটি শুরু করেছি এবং এটি আচরণটি ভেঙে দিয়েছে।
KYL3R


10

আমার তাড়াতাড়ি আমার অ্যাপ্লিকেশনগুলির একটিতে একটি বার্তা তালিকা আপডেট করার দরকার ছিল, তাই আমি যে ডায়ালগটি ছিলাম তা বন্ধ করার আগে আমি কেবলমাত্র আমার মূল UI ক্রিয়াকলাপটি রিফ্রেশ করেছিলাম I'm আমি নিশ্চিত যে এটি সম্পাদন করার আরও ভাল উপায় আছে।

// Refresh main activity upon close of dialog box
Intent refresh = new Intent(this, clsMainUIActivity.class);
startActivity(refresh);
this.finish(); //

9

অ্যান্ড্রয়েডে এমন একটি প্রক্রিয়া পরিচালন সিস্টেম অন্তর্ভুক্ত রয়েছে যা ক্রিয়াকলাপ তৈরি এবং ধ্বংস পরিচালনা করে যা কোনও ক্রিয়াকলাপ ম্যানুয়ালি পুনরায় চালু করা থেকে আপনি যে কোনও সুবিধাকে অবলম্বন করেন তা বেশিরভাগভাবে উপেক্ষা করে। আপনি অ্যাপ্লিকেশন ফান্ডামেন্টাল এ সম্পর্কে আরও তথ্য দেখতে পারেন

তবে ভাল অনুশীলনটি হ'ল এটি নিশ্চিত করা যে আপনার অনপেজ এবং অনটপ পদ্ধতিগুলি এমন কোনও সংস্থান প্রকাশ করে যা আপনার ক্রিয়াকলাপগুলি হ্রাস করতে সর্বনিম্ন ন্যূনতম প্রয়োজনে onLowMemory ধরে রাখার দরকার নেই release


2
+LowMemory উল্লেখ করার জন্য +1। আমি জানতাম না যে এ জাতীয় পদ্ধতিটি বিদ্যমান!
hpique

4

আপনার একই উদ্দেশ্যে শুরু করুন activityএবং বন্ধ করুন activity

Intent refresh = new Intent(this, Main.class);
startActivity(refresh);//Start the same Activity
finish(); //finish Activity.

4

কিছু ক্ষেত্রে এটি সর্বোত্তম অনুশীলন এটি ভাল ধারণা নয় এটি প্রসঙ্গটি চালিত হয় যদি আপনি নীচে ব্যবহার করে এটি বেছে নিয়ে থাকেন তবে কোনও কার্যকলাপ থেকে তাঁর ছেলের কাছে যাওয়ার সর্বোত্তম উপায়:

    Intent i = new Intent(myCurrentActivityName.this,activityIWishToRun.class);    
    startActivityForResult(i, GlobalDataStore.STATIC_INTEGER_VALUE);

জিনিসটি যখনই আপনি ক্রিয়াকলাপ থেকে () শেষ করেন IWishToRun আপনি আপনার জীবন্ত কার্যকলাপে ফিরে আসেন


1
এটি সম্ভবত পুরানো তবে আপনি আমাকে অনেক সময় বাঁচিয়েছেন! :)
লিয়র ইলুজ

4

আপনার সম্পূর্ণ ক্রিয়াকলাপটি পুনরায় লোড করা ভারী কাজ হতে পারে। কোডের যে অংশটি রিফ্রেশ করতে হবে তা কেবল রাখুন ( কোটলিন ):

override fun onResume() {
    super.onResume()
    //here...
}

জাভা:

@Override
public void onResume(){
    super.onResume();
    //here...

}

এবং যখনই প্রয়োজন হবে " অনারুমিউম () " কল করুন ।


2

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


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

আপনার ক্ষেত্রে "আবেদনের অবস্থা" কী? পছন্দসমূহ?
জেহেরার

2

এটির জন্য কিছুক্ষণ পরীক্ষার পরে আমি কোনও কার্যকলাপ পুনরায় চালু করার কোনও অপ্রত্যাশিত ফলাফল খুঁজে পাইনি। এছাড়াও, আমি বিশ্বাস করি এটি ওরিয়েন্টেশন পরিবর্তনের সময় অ্যান্ড্রয়েড ডিফল্টরূপে যা করে তার সাথে অনেকটাই মিলে যায়, সুতরাং আমি এটি একই রকম পরিস্থিতিতে না করার কারণ দেখছি না।


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

আপনি কীভাবে ক্রিয়াকলাপটি পুনরায় শুরু করছেন?
এইচপিফিক

2

আমারও একই সমস্যা

import android.support.v4.content.IntentCompat;

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |IntentCompat.FLAG_ACTIVITY_CLEAR_TASK);

এই কোডটি আমার জন্য কাজ করে। অ্যান্ড্রয়েড এপিআই 17


2

একটি ক্রিয়াকলাপে আপনি ক্রিয়াকলাপটি recreate()"পুনরায় তৈরি করতে" কল করতে পারেন (এপিআই 11+)


1

সেটিং: আমি মত অন্য পদ্ধতির ছিল launchModeআমার কার্যকলাপের singleTopএবং কলিং ছাড়া finish()শুধু startActivity(getIntent())কাজ হবে। শুধু উভয় নতুন তথ্য যত্নশীল আছে onCreate()এবং onNewIntent। সুশের উপায়ের সাথে, অ্যাপ্লিকেশনটি চোখ ধাঁধানো হতে পারে আমান সিংহ বলেছিলেন। তবে আমান সিংহের এই পন্থাটি এখনও একটি নতুন ক্রিয়াকলাপ তৈরি করবে যা একরকম, অপ্রয়োজনীয়, এমনকি যদি সে 'পলক' সমস্যাটি স্থির করে, তবে আমি মনে করি।

এই প্রশ্নের জন্য খুব দেরী, তবে কেউ যদি সমাধানের সন্ধান করে তবে এটি এখানে।


0

লগইন করার পরে আমার একই সমস্যা ছিল তাই আমি ব্যবহার করেছি

@Override
protected void onRestart() {
    this.recreate();
    super.onRestart();
}


0

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

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