অ্যান্ড্রয়েডে কীভাবে কার্যকলাপ পুনরায় চালু করবেন


381

আমি কীভাবে একটি অ্যান্ড্রয়েড পুনরায় চালু করব Activity? আমি নিম্নলিখিত চেষ্টা করেছিলাম, কিন্তু Activityসহজভাবে ছেড়ে দেয়।

public static void restartActivity(Activity act){

        Intent intent=new Intent();
        intent.setClass(act, act.getClass());
        act.startActivity(intent);
        act.finish();

}

9
কার্যকলাপটি ছেড়ে দেয় কারণ আপনি "অ্যাক্ট.ফিনিশ ()" বলেছিলেন; তত্ক্ষণাত্ ক্রিয়াকলাপটি তৈরি করার পরে ...
নিখিল দীনেশ

1
পুরানো পদ্ধতি
pedjjj

উত্তর:


623

আমি এইভাবে আমার থিম স্যুইচারটি করেছি:

Intent intent = getIntent();
finish();
startActivity(intent);

মূলত, আমি finish()প্রথমে কল করছি এবং এই ক্রিয়াকলাপটি শুরু করার সাথে সাথে ঠিক একই অভিপ্রায়টি ব্যবহার করছি। সেই কৌশলটি কি মনে হচ্ছে?

আপডেট: নীচে রাল্ফ দ্বারা নির্দেশিত হিসাবে, Activity.recreate()API এবং 11 এর বাইরে যাওয়ার উপায়। আপনি যদি কোনও API11 + পরিবেশে থাকেন তবে এটি পছন্দনীয়। আপনি এখনও 10 সংস্করণ বা নীচে এপি থাকলে বর্তমান সংস্করণটি পরীক্ষা করে উপরে কোড স্নিপেট কল করতে পারেন। (দয়া করে রালফের উত্তরটিকে উঁচুতে ভুলে যাবেন না!)


36
এবং এটা ডাউনভোটিং মূল্য? এটি ওপি দ্বারা উল্লিখিত প্রয়োজনীয়তা ছিল না। আসলে এটি পছন্দসই হতে পারে।
ইবোমাইক 11'11

9
ঠিক আছে, যদি আপনি অ্যানিমেশনটি পছন্দ না করেন তবে আপনি এটি বন্ধ করতে পারেন (যেমনটি আপনি নিজের উত্তরে দেখিয়েছেন)। এটি প্রতি সেপ্টেম্বর আমার উত্তরকে ভুল করে না, এটি কেবলমাত্র কিছু অতিরিক্ত বিকল্প প্রদর্শন করছে না যা আপনি যুক্ত করতে মুক্ত (এবং এটি প্রশ্নে জিজ্ঞাসা করা হয়নি)।
ইবোমাইক

28
আমি মনে করি আপনি ভুল পেয়েছেন। ডাউনভোটের অর্থ ভুল / খারাপ উত্তর, এবং আপভোটের অর্থ একটি উত্তর দুর্দান্ত। অন্যের সাথে কীভাবে উত্তরের উত্তর তুলনা করা যায় তা আপভোটের সংখ্যা দ্বারা নির্দেশিত। আমি দেখতে পাচ্ছি যে আপনি নিজের উত্তর প্রচার করার চেষ্টা করছেন তবে আপনি সেই উদ্দেশ্যে সিস্টেমটির অপব্যবহার করছেন।
ইবোমাইক 12'11

8
+1 - এটি আমার পক্ষে দুর্দান্ত কাজ করেছে এবং আপনি যেমন বলেছিলেন অ্যানিমেশনটি এমন কিছু যা আমি চাইছিলাম, তাই ব্যবহারকারী জানেন যে এটি পুনরায় চালু হচ্ছে। এফডাব্লুআইডাব্লু, আমি যখন এ প্রশ্নের বিকল্প বিকল্প উত্তর সরবরাহ করি তখন অন্য ব্যবহারকারীদের জবাব কখনই ডাউন-ভোটাভুটি না করার নিয়ম করি, যদিও আমার উত্তরটি বর্ধিত হলে আমি মাঝে মধ্যেই আপ-ভোট করি (এটি এখানে ঘটেছিল তা বলছি না, কেবল আমি এটি করি) ।
মাইকেল ব্রে

4
ইবোমাইক এবং বেন: আপনার উভয় সমাধানই ওপির প্রশ্নের উত্তর দিয়েছে answered নির্ভুলভাবে "নান্দনিক" কারণে কারও জবাবকে ভোট দেওয়া, ভাল, দুর্দান্ত নয়। আমি এখানে
স্ট্যাকওভারফ্লোতে

368

এপিআই স্তর ১১ (হানিকম্ব) থেকে আপনি ক্রিয়াকলাপটি পুনরায় তৈরি () পদ্ধতিতে ( এই উত্তরের জন্য ধন্যবাদ ) কল করতে পারেন ।

পুনঃনির্ধারণ () পদ্ধতিটি ঠিক একটি কনফিগারেশনের পরিবর্তনের মতো কাজ করে, সুতরাং আপনার onSaveInstanceState () এবং onRestoreInstanceState () পদ্ধতিগুলি প্রযোজ্য হলে, ডাকা হয়।


3
যদি পূর্ববর্তী ক্রিয়াকলাপটি স্টার্টঅ্যাক্টিভিটি ফর রিসাল্ট ব্যবহার করে একে বলে?
অ্যান্ড্রয়েড বিকাশকারী

1
ঠিক আছে, যদি আপনার এপিআই ১১ এর চেয়ে কম কিছু সমর্থন করার প্রয়োজন না হয় তবে এটি সঠিক উত্তর
এডওয়ার্ড ফ্যালক

@ অ্যাডওয়ার্ডফাল্ক এমন কোনও ফাংশন রয়েছে যা সমর্থন লাইব্রেরিতে এটি করে?
অ্যান্ড্রয়েড বিকাশকারী

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

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

132

এসডিকে 11 এর আগে এটি করার একটি উপায় এরকম:

public void reload() {
    Intent intent = getIntent();
    overridePendingTransition(0, 0);
    intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
    finish();
    overridePendingTransition(0, 0);
    startActivity(intent);
}

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

8
এটি লঞ্চার দ্বারা শুরু করা মূল ক্রিয়াকলাপে কাজ করে না। অভিপ্রায় কিছু পতাকা সেট করার কারণে আপনার ক্রিয়াকলাপটি লুকানো শেষ হবে। অন্যথায় এটি দুর্দান্তভাবে কাজ করে।
টমাস আহলে

ভাল যুক্তি. অর্থবোধ করে কারণ এটি স্ট্যাকের বেস ক্রিয়াকলাপ থেকে ফিনিস () কে কল করে।
বেন

ক্রিয়াকলাপের থিমটি পরিবর্তন করার সময় এই কল করা গতিটি (অ্যানিমেশন ছাড়াই) আনবে বলে মনে হচ্ছে
অশোক গলি

3
মূল ক্রিয়াকলাপ সহ আমার জন্যও +1 সূক্ষ্মভাবে কাজ করে। যাইহোক, যদি আপনি কল করা উচিত overridePendingTransition(0, 0);পর finish()এবং startActivity()যথাক্রমে যেখানে আপনি এটি ডেকে বলল, না ...
কাকের ডাক

115

কেবল রাল্ফ এবং বেনের উত্তরগুলি (মন্তব্যে করা পরিবর্তনগুলি সহ) একত্রিত করতে:

if (Build.VERSION.SDK_INT >= 11) {
    recreate();
} else {
    Intent intent = getIntent();
    intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
    finish();
    overridePendingTransition(0, 0);

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

8
সবার সেরা উত্তর। বিশ্বাস করুন বা না করুন, আমি এখনও এপিআই 3 ডিভাইস সমর্থন করছি, এবং ভার্সন.এসডি কেএনপিটি মানটির জন্য এপিআই 4 প্রয়োজন। :)
এডওয়ার্ড

31

আমি এই কোডটি ব্যবহার করেছি যাতে আমি এখনও পুরানো অ্যান্ড্রয়েড সংস্করণগুলিকে সমর্থন করতে পারি এবং recreate()নতুন অ্যান্ড্রয়েড সংস্করণগুলিতে ব্যবহার করতে পারি ।

কোড:

public static void restartActivity(Activity activity){
    if (Build.VERSION.SDK_INT >= 11) {
        activity.recreate();
    } else {
        activity.finish();
        activity.startActivity(activity.getIntent());
    }
}

নমুনা:

import android.app.Activity;
import android.os.Build;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {
    private Activity mActivity;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mActivity = MainActivity.this;

        Button button = (Button) findViewById(R.id.restart_button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                restartActivity(mActivity);
            }
        });
    }

    public static void restartActivity(Activity activity) {
        if (Build.VERSION.SDK_INT >= 11) {
            activity.recreate();
        } else {
            activity.finish();
            activity.startActivity(activity.getIntent());
        }
    }
}

আমার জন্য দুর্দান্ত কাজ !!
পাপো

22

এই সমাধানটি আমার পক্ষে কাজ করেছিল।

প্রথমে ক্রিয়াকলাপ শেষ করুন এবং তারপরে আবার এটি শুরু করুন।

কোডের উদাহরণ:

public void restartActivity(){
    Intent mIntent = getIntent();
    finish();
    startActivity(mIntent);
}

20

এটি বর্তমান ক্রিয়াকলাপটি পুনঃসূচনা করার সবচেয়ে সহজতম উপায়:

finish();
startActivity(getIntent());

19

এই পদ্ধতিটি কল করুন

private void restartFirstActivity()
 {
 Intent i = getApplicationContext().getPackageManager()
 .getLaunchIntentForPackage(getApplicationContext().getPackageName() );

 i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK );
 startActivity(i);
 }

ধন্যবাদ,


1
আমি মনে করি যে ওপি কোনও কার্যক্রম পুনরায় আরম্ভ করতে চায়, প্রথমটি নয়, এটি আমার পক্ষে সহায়ক ছিল।
ক্রিস্টোফার জনসন

1
দুটি পতাকা জেনে রাখা ভাল, আমার কেসগুলি এগুলি ছাড়া কিছুই করতে পারে বলে মনে হয়েছিল।
ওভেন বি

1
এটি আপনাকে ধন্যবাদ কাজ! আল্লাহ্ তোমার মঙ্গল করুক .
বিবেক

16

যদিও এর একাধিকবার উত্তর দেওয়া হয়েছে।

যদি কোনও খণ্ড থেকে কোনও ক্রিয়াকলাপ পুনরায় আরম্ভ করা হয় তবে আমি এটির মতো করব:

new Handler().post(new Runnable() {

         @Override
         public void run()
         {
            Intent intent = getActivity().getIntent();
            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_NO_ANIMATION);
            getActivity().overridePendingTransition(0, 0);
            getActivity().finish();

            getActivity().overridePendingTransition(0, 0);
            startActivity(intent);
        }
    });

তাই আপনি ভাবছেন এই একটু ওভারকিল? তবে Handlerপোস্টিং আপনাকে একটি লাইফাইসাইকেল পদ্ধতিতে এটি কল করতে দেয়। ব্যবহারকারীর অ্যাপ্লিকেশনটিতে ফিরে আসার মধ্যে কি রাষ্ট্রের পরিবর্তন হয়েছে কিনা তা যাচাই করার সময় আমি onRestart/ onResumeপদ্ধতিগুলিতে এটি ব্যবহার করেছি । (কিছু ইনস্টল করা)

Handlerযদি আপনি এটিকে কোনও বিজোড় জায়গায় কল করেন তবে এটি কেবল ক্রিয়াকলাপটিকে মেরে ফেলবে এবং এটিকে পুনরায় আরম্ভ করবে না।

নির্দ্বিধায় যে কোন প্রশ্ন জিজ্ঞাসা কর।

চিয়ার্স, ক্রিস


2
হ্যান্ডলারের পক্ষে দুর্দান্ত সমাধান এবং খুব ভাল যুক্তি / ব্যাখ্যা।
JRomero

1
আপনি কেন "ওভাররাইডপেন্ডিং ট্রান্সশন" এর জন্য দু'বার কল করবেন?
অ্যান্ড্রয়েড বিকাশকারী

1
@ অ্যান্ড্রয়েড ডেভেলপার আমি মনে করতে পারি না, আমি মনে করি এটি বাগের কাজ ছিল। আপনি স্টার্টঅ্যাক্টিভিটি () এর আগে একবার কল করতে পারেন এবং এটি যেমনটি বলেছে তেমন করবে।
ক্রিস। জেনকিন্স

এটি আমার অনারিউম ফাংশনে প্রয়োগ করার পরে, গেমটি আমার অনটপ পদ্ধতিতে থামে এবং একটি কালো স্ক্রিন রয়েছে ... কেন তা নিশ্চিত নয়
Scumble373

1
হাই ক্রিস, আপনি কি আরও খানিকটা ব্যাখ্যা করতে পারেন "হ্যান্ডলার ছাড়া আপনি যদি কোনও অদ্ভুত জায়গায় কল করেন তবে এটি কেবল ক্রিয়াকলাপটিকে মেরে ফেলবে এবং পুনরায় আরম্ভ করবে না।" ?
পারভেজ রাফি

15

ভাল এটি তালিকাভুক্ত নয় তবে ইতিমধ্যে পোস্ট করা কিছুগুলির একটি কম্বো:

if (Build.VERSION.SDK_INT >= 11) {
    recreate();   
} else {
    Intent intent = getIntent();
    finish();
    startActivity(intent);
}

এটি আমার জন্য কাজ করে .. ধন্যবাদ .. তবে আমি আপনাকে জিজ্ঞাসা করতে চাই: কেন আমি যখন কোডটির প্রথম অংশটি (এসডিকেটিপিটি যাচাই করে) আমার অ্যাপটি তুলনামূলকভাবে ধীরে ধীরে চালিত হয় কেন? !! .. যখন আমি কোডটি আবার সংযুক্ত করি তখন এটি চলে, তুলনামূলকভাবে এবং স্পষ্টতই, অনেক দ্রুত !!!
ম্যাকলান

2
এটা নিশ্চিত না। ঠিক আছে, আপনি যদি কোনও এসডিকে ব্যবহার করছেন যা> = 11 তবে পুনরায় তৈরি করুন () অভিপ্রায় পাওয়ার চেয়ে দ্রুত হওয়া উচিত, শেষ করে, আবার এটি শুরু করা starting অনটপ থেকে চলে এমন কল কোড শেষ করুন এবং ওরিয়েন্টেশন পরিবর্তনের মতো রান কোডটি পুনরায় তৈরি করুন ... সুতরাং এটি করার মতো যথেষ্ট নয়।
25:55

4

ক্যামেরার সাথে অদ্ভুত সারফেসভিউ লাইফসাইকেলের আচরণের সাথে একত্রে । আমি খুঁজে পেয়েছি যে পুনরায় তৈরি () সার্ফেসভিউয়ের জীবনচক্রের সাথে ভাল আচরণ করে না। পৃষ্ঠচলাচল কখনও বিনোদন চক্র সময় বলা হয় না। এটি অনারিউম (অদ্ভুত) এর পরে বলা হয়, যেখানে আমার সারফেসভিউটি বিনষ্ট হয়।

কোনও ক্রিয়াকলাপ পুনরুদ্ধারের আসল উপায়টি দুর্দান্ত কাজ করে।

Intent intent = getIntent();
finish();
startActivity(intent);

আমি কেন এটি ঠিক তা বুঝতে পারি না, তবে এটি কেবলমাত্র একটি পর্যবেক্ষণ যা ভবিষ্যতে আশাবাদী অন্যকে গাইড করতে পারে কারণ এটি আমার সারফেসভিউগুলির সাথে আমার সমস্যাগুলি স্থির করেছিল fixed


4

আমি অবাক হয়েছি কেন কেন কেউ উল্লেখ করেনি Intent.makeRestartActivityTask()যে পরিষ্কারভাবে এই সঠিক উদ্দেশ্যটি তৈরি করে।

এমন একটি ইন্টেন্ট তৈরি করুন যা অ্যাপ্লিকেশনটির টাস্কটিকে তার বেস অবস্থায় পুনরায় চালু করতে ব্যবহার করা যেতে পারে।

startActivity(Intent.makeRestartActivityTask(getActivity().getIntent().getComponent()));

এই পদ্ধতিটি Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASKডিফল্ট পতাকা হিসাবে সেট করে ।


3

প্রকৃতপক্ষে নীচের কোডটি এপিআই লেভেল 5 এবং তারপরের জন্য বৈধ, সুতরাং আপনার টার্গেট এপিআই যদি এর চেয়ে কম হয় তবে আপনি ইবোমাইকের কোডের সাথে খুব মিলপূর্ণ কিছু দিয়ে শেষ করবেন।

intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
overridePendingTransition(0, 0);

3

একটি হ্যাকি উপায় আছে যা মূল কার্যকলাপ সহ যে কোনও ক্রিয়াকলাপে কাজ করা উচিত।

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);

যখন অরিয়েন্টেশন পরিবর্তন হয়, অ্যান্ড্রয়েড সাধারণত আপনার ক্রিয়াকলাপটি পুনরায় তৈরি করবে (যদি আপনি এটি ওভাররাইড না করেন)। অ্যান্ড্রয়েড যখন আপনার ক্রিয়াকলাপ পুনরায় তৈরি না করে তখন এই পদ্ধতিটি 180 ডিগ্রি ঘূর্ণনের জন্য কার্যকর।


3
public void onRestart() {
    super.onRestart();
    Intent intent=new Intent();
    intent.setClass(act, act.getClass());
    finish();
    act.startActivity(intent);
}

এটি ব্যবহার করার চেষ্টা করুন ..


3

আপনার প্রশ্নের সমাধানটি হ'ল:

public static void restartActivity(Activity act){
    Intent intent=new Intent();
    intent.setClass(act, act.getClass());
    ((Activity)act).startActivity(intent);
    ((Activity)act).finish();
}

নতুন ক্রিয়াকলাপ শুরু করতে এবং বর্তমান ক্রিয়াকলাপটি শেষ করতে আপনাকে ক্রিয়াকলাপের প্রসঙ্গে কাস্ট করতে হবে।

আশা করি এটি সহায়ক .. এবং আমার জন্য কাজ করে।


1

আপনি যদি শেষ লাইনটি সরিয়ে ফেলেন তবে আপনি নতুন actক্রিয়াকলাপ তৈরি করবেন তবে আপনার পুরানো উদাহরণটি এখনও জীবিত থাকবে।

ওরিয়েন্টেশন পরিবর্তিত হওয়ার সময় আপনার কীভাবে কার্যকলাপটি পুনরায় চালু করতে হবে (যেমন আপনার রাজ্যটি সংরক্ষণ করে দেওয়া হয়েছে onCreate(Bundle))?

যদি আপনি এটি না করেন, তবে একটি সম্ভাব্য কাজটি হ'ল একটি অতিরিক্ত, ডামি অ্যাক্টিভিটি ব্যবহার করা যা প্রথম ক্রিয়াকলাপ থেকে শুরু করা হবে এবং কোন কাজটি এর নতুন উদাহরণ শুরু করা। অথবা নতুনটি act.finish()শুরু হওয়ার পরে, কলটি বিলম্ব করুন ।

আপনার যদি বেশিরভাগ রাজ্য সংরক্ষণ করার দরকার হয় তবে আপনি বেশ গভীর জলে ভেসে যাচ্ছেন, কারণ আপনার রাজ্যের সমস্ত সম্পত্তি বিশেষত আপনার পুরানো প্রসঙ্গ / ক্রিয়াকলাপটি ফাঁস করে নতুন দৃষ্টান্ত দিয়ে ছাড়াই অযৌক্তিক।

দয়া করে, আপনি কী করতে চাইছেন তা উল্লেখ করুন।


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

আপাতত, আপনার ক্রিয়াকলাপ পুনরায় চালু করার জন্য কোনও পরিষ্কার, এসডিকে-পাকা উপায় নেই, এএফআইএকি - আপনি যদি কিছু ফাঁস না করেন তবে আপনি যেতে পারেন :)
দিমিতর দিমিত্রভ

0

এইভাবেই আমি এটি করি।

        val i = Intent(context!!, MainActivity::class.java)
        i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK)
        startActivity(i)

-1

আপনি যদি কিছু অংশ থেকে কল করছেন তাই কোডের নীচে করুন।

Intent intent = getActivity().getIntent();
getActivity().finish();
startActivity(intent);

-4

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

onRestart ()

পদ্ধতি হিসাবে নিম্নলিখিত

 @Override
    protected void onRestart() {
        super.onRestart();
        setContentView(R.layout.add_entry);
    }

এবং যেখানে আপনি বর্তমান ক্রিয়াকলাপটি পুনরায় আরম্ভ করতে চান সেখানে অনিয়ন্ত্রিত কল করুন)


-5

পদ্ধতিটি অনক্রিটে কল করুন। উদাহরণ স্বরূপonCreate(null);

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