অ্যান্ড্রয়েড: ক্রিয়াকলাপ চলছে কিনা তা আমি কীভাবে পরীক্ষা করব?


152

নির্দিষ্ট কার্যকলাপ সক্রিয় আছে কি না তা নির্ধারণের কোনও সহজ উপায় আছে কি? কোন কার্যকলাপটি সক্রিয় রয়েছে তার উপর নির্ভর করে আমি কিছু নির্দিষ্ট কাজ করতে চাই do উদাহরণ:

if(activityrunning == activity1)
//do this
else if (activityrunning == activity2)
//do something else

কোনও ক্রিয়াকলাপ চলছে কিনা তা যাচাই করতে আপনি এই উত্তরটি দিয়ে যেতে পারেন: স্ট্যাকওভারফ্লো.com
রাহুল শর্মা

উত্তর:


227

আপনি staticক্রিয়াকলাপের মধ্যে একটি পরিবর্তনশীল ব্যবহার করতে পারেন ।

class MyActivity extends Activity {
     static boolean active = false;

      @Override
      public void onStart() {
         super.onStart();
         active = true;
      } 

      @Override
      public void onStop() {
         super.onStop();
         active = false;
      }
}

একমাত্র গোচা হ'ল যদি আপনি এটি দুটি ক্রিয়াকলাপে একে অপরের সাথে সংযুক্ত করে ব্যবহার onStopকরেন তবে প্রথমে কখনও কখনও onStartদ্বিতীয় পরে বলা হয় । সুতরাং উভয় সংক্ষেপে সত্য হতে পারে।

আপনি যা করার চেষ্টা করছেন তার উপর নির্ভর করে (কোনও পরিষেবা থেকে বর্তমান ক্রিয়াকলাপটি আপডেট করবেন?) আপনি আপনার ক্রিয়াকলাপ onStartপদ্ধতিতে পরিষেবাটিতে কেবল স্থির শ্রোতাকে নিবন্ধভুক্ত করতে পারেন তবে যখন আপনার পরিষেবাটি ইউআই আপডেট করতে চায় তখন সঠিক শ্রোতা পাওয়া যাবে।


5
কেউ একজন এটি আমার দিকে ইঙ্গিত করেছেন যে.... মেমরি ফাঁস সমস্যার কারণে স্থির পরিবর্তনশীলের তুলনায় শ্যাডরিফারেন্সটিকে পছন্দ করা উচিত।
আয়ুশ গোয়েল

13
একই শ্রেণীর বিভিন্ন কার্যক্রম চললে কী হবে? আপনি যদি প্রসারিত MyActivityহন MyChildactivityএবং শিশুটি সক্রিয় আছে কিনা তা পরীক্ষা করতে চান?
মিস্টার স্মিথ

2
আপনার "চলমান" এর সংজ্ঞা অনুসারে আপনি ওরিউসুম এবং অনপজে ভেরিয়েবলের অবস্থার পরিবর্তন করতে চাইতে পারেন ....
জি ব্লেক মাইক

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

6
আপনি যদি স্টাটিক্সের পরামর্শ দেন, আপনি আমার কাছ থেকে একটি -1 পাবেন
মেটেই সুইকা

51

আমি বুঝতে পারি যে এই সমস্যাটি বেশ পুরানো, তবে আমি মনে করি এটি এখনও আমার সমাধানটি ভাগ করে নেওয়া উপযুক্ত কারণ এটি অন্যের পক্ষে কার্যকর হতে পারে।

অ্যান্ড্রয়েড আর্কিটেকচার উপাদানগুলি প্রকাশের আগে এই সমাধানটি উপলব্ধ ছিল না।

কার্যকলাপ কমপক্ষে আংশিকভাবে দৃশ্যমান

getLifecycle().getCurrentState().isAtLeast(STARTED)

কার্যক্রম অগ্রভাগে রয়েছে

getLifecycle().getCurrentState().isAtLeast(RESUMED)

3
। getLifecycle () getCurrentState () isAtLeast (Lifecycle.State.RESUMED)।
Radhey

43

আমি এর মতো আরও পরিষ্কার মনে করি:

  public boolean isRunning(Context ctx) {
        ActivityManager activityManager = (ActivityManager) ctx.getSystemService(Context.ACTIVITY_SERVICE);
        List<RunningTaskInfo> tasks = activityManager.getRunningTasks(Integer.MAX_VALUE);

        for (RunningTaskInfo task : tasks) {
            if (ctx.getPackageName().equalsIgnoreCase(task.baseActivity.getPackageName())) 
                return true;                                  
        }

        return false;
    }

2
আমি 'ফর' লুপের আগে অস্থায়ী পরিবর্তনশীলগুলি এড়াতে চেষ্টা করি; (রানিংটাস্কআইনফো টাস্কের জন্য: ক্রিয়াকলাপে ম্যানেজ.আরজিটরানিংটাস্কস (পূর্ণসংখ্যা.ম্যাক্স_ভ্যালু)) {...
মাইকব্যাকক

এই ফাংশনটি আমি কীভাবে বলতে পারি?
বেহজাদ

1
যথারীতি, এমন একটি মিথোড যা আপনার ক্লাসের অভ্যন্তরে 'ফাংশন' হিসাবে কল করতে পারে আপনার কি উদাহরণ দরকার?
জেনিওনি

10
বিকাশকারী.অ্যান্ড্রয়েড. com/references/android/app/… থেকে "অ্যাপ্লিকেশনটিতে মূল যুক্তির জন্য এটি কখনই ব্যবহার করা উচিত নয়, যেমন এখানে পাওয়া তথ্যের ভিত্তিতে বিভিন্ন আচরণের মধ্যে সিদ্ধান্ত নেওয়া Such এ জাতীয় ব্যবহারগুলি সমর্থিত নয়, এবং সম্ভবত এটি ভেঙে যাবে ভবিষ্যতে। "
জো_ডেনিয়েবল

15
এপিআই লেভেল 21 (অ্যান্ড্রয়েড 5.0 ললিপপ) হিসাবে এই পদ্ধতিটিকে অবচয় করা হয়েছে।
এক্সিএফেক্ট

29

কোনও সহায়ক ভেরিয়েবল ব্যবহার না করে একটি বিকল্প হ'ল:

activity.getWindow().getDecorView().getRootView().isShown()

যেখানে ক্রিয়াকলাপ হল fe: এটি বা getActivity ()।

এই অভিব্যক্তি দ্বারা ফেরত মানটি অন স্টার্ট () / অনস্টপ () এ পরিবর্তিত হয়, যা ফোনে ক্রিয়াকলাপের লেআউট দেখানো / থামানো ইভেন্টগুলি।


16
জাসুত ব্যবহার হয় না কেন Activity#getWindow().getDecorView().isShown()?
জিয়ানলুকা পি।

24

আমি MyActivity.class এবং getCanonicalName পদ্ধতি ব্যবহার করেছি এবং আমি উত্তর পেয়েছি।

protected Boolean isActivityRunning(Class activityClass)
{
        ActivityManager activityManager = (ActivityManager) getBaseContext().getSystemService(Context.ACTIVITY_SERVICE);
        List<ActivityManager.RunningTaskInfo> tasks = activityManager.getRunningTasks(Integer.MAX_VALUE);

        for (ActivityManager.RunningTaskInfo task : tasks) {
            if (activityClass.getCanonicalName().equalsIgnoreCase(task.baseActivity.getClassName()))
                return true;
        }

        return false;
}

1
পূর্বে উল্লিখিত হিসাবে, এটি অবমানিতgetRunningTasks() হওয়ার কারণে এটি ব্যবহার করা ভাল ধারণা নাও হতে পারে : androidxref.com/9.0.0_r3/xref/frameworks/base/core/java/android/…
দিমিত্রিভ

21

স্ট্যাটিক ভেরিয়েবল ব্যবহার করা ও ওওপি অনুসরণ করার চেয়ে অনেক ভাল উপায়

Shared Preferencesঅন্যের সাথে activitiesপরিষেবাগুলির সাথে ভেরিয়েবলগুলি ভাগ করতে ব্যবহার করা যেতে পারে oneapplication

    public class example extends Activity {

    @Override
    protected void onStart() {
        super.onStart();

        // Store our shared preference
        SharedPreferences sp = getSharedPreferences("OURINFO", MODE_PRIVATE);
        Editor ed = sp.edit();
        ed.putBoolean("active", true);
        ed.commit();
    }

    @Override
    protected void onStop() {
        super.onStop();

        // Store our shared preference
        SharedPreferences sp = getSharedPreferences("OURINFO", MODE_PRIVATE);
        Editor ed = sp.edit();
        ed.putBoolean("active", false);
        ed.commit();

    }
}

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


ধন্যবাদ। তবে অন রেসুমেরও ব্রো দরকার?

1
এটি সক্রিয় দ্বারা আপনি কী বোঝেন তার উপর নির্ভর করে। আমার কোড অনুসারে, ক্রিয়াকলাপ স্ট্যাকের মধ্যে রয়েছে তবে এটি সক্রিয়। এবং যদি আপনি দৃশ্যমান হ্যান্ডেল করতে চান বা না চান তবে আপনি অনটি ব্যবহার করতে পারেন
জার ই আহমের

19
কার্যকলাপটি কল না করে মারা গেলে এই বিরতি ঘটেonStop()
মার্সেল ব্রো

3
অ্যাপ ক্রাশ হলে কী হবে?
ucMedia

1
এটি একটি অত্যন্ত বিপজ্জনক "সমাধান"।
ফিরজেন

9

কোনও নির্দিষ্ট পরিষেবা চলছে কিনা তা যাচাই করার জন্য এটি কোড। আমি মোটামুটি নিশ্চিত যে আপনি getRunningAppProcesses () বা getRunningTasks () দিয়ে getRunningServices পরিবর্তন করবেন ততক্ষণ এটি কোনও ক্রিয়াকলাপের জন্য কাজ করতে পারে। এখানে দেখুন http://developer.android.com/references/android/app/ActivityManager.html#getRunningAppProcesses ()

কনস্ট্যান্টগুলি পরিবর্তন করুন K

    public static boolean isServiceRunning(Context context) {

    Log.i(TAG, "Checking if service is running");

    ActivityManager activityManager = (ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE);

    List<RunningServiceInfo> services = activityManager.getRunningServices(Integer.MAX_VALUE);

    boolean isServiceFound = false;

    for (int i = 0; i < services.size(); i++) {

        if (Constants.PACKAGE.equals(services.get(i).service.getPackageName())){

            if (Constants.BACKGROUND_SERVICE_CLASS.equals(services.get(i).service.getClassName())){
                isServiceFound = true;
            }
        }
    }

    Log.i(TAG, "Service was" + (isServiceFound ? "" : " not") + " running");

    return isServiceFound;

}

1
তবে মনে রাখবেন যে আপনি যে লিঙ্কটি সরবরাহ করেছেন তা জানিয়েছে "এই পদ্ধতিটি কেবল ব্যবহারকারী-মুখোমুখি প্রক্রিয়া পরিচালনা UI ডিবাগিং বা বিল্ডিংয়ের জন্য।"
জো_ডেনিয়েবল

getRunningTasks এখন অবচয় করা হয়েছে।
আদি

5

উপরের সমস্ত কিছুর চেয়ে অনেক সহজ উপায় আছে এবং এই পদ্ধতির android.permission.GET_TASKSজন্য ম্যানিফেস্টে ব্যবহারের প্রয়োজন হয় না , বা বর্ণের পরিস্থিতি বা মেমরি ফাঁসের বিষয়টি গ্রহণযোগ্য উত্তরে নির্দেশিত হয়।

  1. মূল ক্রিয়াকলাপে একটি স্থিতিশীল পরিবর্তনশীল করুন। স্থিতিশীল অন্যান্য ক্রিয়াকলাপ থেকে ডেটা গ্রহণের জন্য অন্যান্য ক্রিয়াকলাপগুলিকে মঞ্জুরি দেয়। onPause()এই পরিবর্তনশীল সেট মিথ্যা , onResumeএবংonCreate() এই পরিবর্তনশীল সেট সত্য

    private static boolean mainActivityIsOpen;
  2. এই ভেরিয়েবলের গিটার এবং সেটটারগুলি বরাদ্দ করুন।

    public static boolean mainActivityIsOpen() {
        return mainActivityIsOpen;
    }
    
    public static void mainActivityIsOpen(boolean mainActivityIsOpen) {
        DayView.mainActivityIsOpen = mainActivityIsOpen;
    }
  3. এবং তারপরে অন্য ক্রিয়াকলাপ বা পরিষেবা থেকে

    if (MainActivity.mainActivityIsOpen() == false)
    {
                    //do something
    }
    else if(MainActivity.mainActivityIsOpen() == true)
    {//or just else. . . ( or else if, does't matter)
            //do something
    }

3
আপনি কি বলছেন যে অ্যাক্সেসর পদ্ধতি ব্যবহার করা কাঁচা পাবলিক স্ট্যাটিক ভেরিয়েবলগুলি ব্যবহার করার চেয়ে ভাল?
ইগোরগানাপলস্কি

1
জাভাতে আপনার ভেরিয়েবলগুলি ব্যক্তিগত রাখার জন্য সেটার এবং গিটারগুলি ব্যবহার করা ভাল। তবে আমি বিশ্বাস করি যে অ্যান্ড্রয়েডে সরাসরি পাবলিক ভেরিয়েবলগুলি অ্যাক্সেস করা সাধারণ ...
স্টিফেন

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

8
এই কারণেই আপনার কোর্সগুলিকে আরও বেশি
যত্ন সহকারে @ কুলকুলে

1
এবং আপনার যদি ক্রিয়াকলাপটি চালানোর একাধিক উদাহরণ থাকে?
নিকমার্টেনস 1980

5
if(!activity.isFinishing() && !activity.isDestroyed())

অফিসিয়াল ডক্স থেকে:

ভ্রমণ # isFinishing ()

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

ভ্রমণ # isDestroyed ()

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


4

ধন্যবাদ কুকুদি! আমি একটি ক্রিয়াকলাপের জন্য আপনার উত্তরটি খাপ খাইয়ে নিতে সক্ষম হয়েছি ... আমার অ্যাপে যা কাজ করেছে তা এখানে ..

public boolean isServiceRunning() { 

ActivityManager activityManager = (ActivityManager)Monitor.this.getSystemService (Context.ACTIVITY_SERVICE); 
    List<RunningTaskInfo> services = activityManager.getRunningTasks(Integer.MAX_VALUE); 
    isServiceFound = false; 
    for (int i = 0; i < services.size(); i++) { 
        if (services.get(i).topActivity.toString().equalsIgnoreCase("ComponentInfo{com.lyo.AutoMessage/com.lyo.AutoMessage.TextLogList}")) {
            isServiceFound = true;
        }
    } 
    return isServiceFound; 
} 

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

<uses-permission  android:name="android.permission.GET_TASKS"/>

আশা করি এটা উপকারে এসেছিল!


1
এই ব্যবহারের অনুমতিটি এপিআই স্তরের 21-
গাই ওয়েস্ট

2
শীর্ষস্থানীয় ক্রিয়াকলাপ (পরিষেবাদি [i] .টপঅ্যাক্টিভিটি) অ্যাক্সেস করার জন্য এ্যানসওয়ারটি ডাউনওয়োট করুন আমরা এপিআই স্তর ন্যূনতম। যে নীচে কাজ করবে না নীচে।
দেবাশীষ ঘোষ

4

আমি মনে করি গ্রহণযোগ্য উত্তর হ'ল এটি পরিচালনা করার এক ভয়ঙ্কর উপায়।

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

@protected
void doSomething() {
}

এবং এটি উত্পন্ন শ্রেণিতে ওভাররাইড করুন।

ইভেন্টটি ঘটলে, কেবল বেস ক্লাসে এই পদ্ধতিটি কল করুন। সঠিক 'সক্রিয়' শ্রেণি তখন এটি পরিচালনা করবে। ক্লাস নিজেই চেক করতে পারে যদি তা না হয় Paused()

আরও ভাল, গ্রিনরোবট , স্কোয়ারের মতো ইভেন্টের বাসটি ব্যবহার করুন তবে এটির অবমূল্যায়ন করা হয়েছে এবং আরএক্সজাভা ব্যবহার করার পরামর্শ দেয়


2

আমি একটি চেক ব্যবহার করেছি if (!a.isFinishing())এবং এটি আমার যা প্রয়োজন তা করা মনে হচ্ছে। aক্রিয়াকলাপের উদাহরণ। এটা কি ভুল? কেন কেউ এ চেষ্টা করেননি?


2

কি সম্পর্কে activity.isFinishing()


এটি কোনও সমাধানের কার্যকর কারণ নয়, এটি হত্যার প্রক্রিয়াতে কোনও ক্রিয়াকলাপ আছে কিনা তা ফিনিশিং নির্দেশ করে।
ভেলোসিটিপুলস

2

ক্রিয়াকলাপিফাইসাইকেলব্যাকস অ্যাপ্লিকেশনটিতে সমস্ত ক্রিয়াকলাপের উপর নজর রাখার দুর্দান্ত উপায়:

public class BaseActivityLifecycleCallbacks implements Application.ActivityLifecycleCallbacks {

private ActivityState homeState, contentState;

@Override
public void onActivityCreated(Activity activity, Bundle bundle) {
    if (activity instanceof HomeActivityv2) {
        homeState = ActivityState.CREATED;
    } else if (activity instanceof ContentDisplayActivity) {
        contentState = ActivityState.CREATED;
    }
}

@Override
public void onActivityStarted(Activity activity) {
    if (activity instanceof HomeActivityv2) {
        homeState = ActivityState.STARTED;
    } else if (activity instanceof ContentDisplayActivity) {
        contentState = ActivityState.STARTED;
    }
}

@Override
public void onActivityResumed(Activity activity) {
    if (activity instanceof HomeActivityv2) {
        homeState = ActivityState.RESUMED;
    } else if (activity instanceof ContentDisplayActivity) {
        contentState = ActivityState.RESUMED;
    }
}

@Override
public void onActivityPaused(Activity activity) {
    if (activity instanceof HomeActivityv2) {
        homeState = ActivityState.PAUSED;
    } else if (activity instanceof ContentDisplayActivity) {
        contentState = ActivityState.PAUSED;
    }
}

@Override
public void onActivityStopped(Activity activity) {
    if (activity instanceof HomeActivityv2) {
        homeState = ActivityState.STOPPED;
    } else if (activity instanceof ContentDisplayActivity) {
        contentState = ActivityState.STOPPED;
    }
}

@Override
public void onActivitySaveInstanceState(Activity activity, Bundle bundle) {
}

@Override
public void onActivityDestroyed(Activity activity) {
    if (activity instanceof HomeActivityv2) {
        homeState = ActivityState.DESTROYED;
    } else if (activity instanceof ContentDisplayActivity) {
        contentState = ActivityState.DESTROYED;
    }
}

public ActivityState getHomeState() {
    return homeState;
}

public ActivityState getContentState() {
    return contentState;
}
}

ActivityState:

public enum ActivityState {
    CREATED, STARTED, RESUMED, PAUSED, STOPPED, DESTROYED;
}

অ্যাপ্লিকেশন শ্রেণি প্রসারিত করুন এবং অ্যান্ড্রয়েড ম্যানিফেস্ট ফাইলে এর রেফারেন্স সরবরাহ করুন:

import android.app.Application;

public final class BaseApplication extends Application {
private BaseActivityLifecycleCallbacks baseALC;

@Override
public void onCreate() {
    super.onCreate();
    baseALC = new BaseActivityLifecycleCallbacks();
    this.registerActivityLifecycleCallbacks(baseALC);

}

public BaseActivityLifecycleCallbacks getBaseALC() {
    return baseALC;
}
}

অন্যান্য ক্রিয়াকলাপের স্থিতির জন্য কার্যকলাপ থেকে কোথাও কোকেকে:

private void checkAndLaunchHomeScreen() {
    Application application = getApplication();
    if (application instanceof BaseApplication) {
        BaseApplication baseApplication = (BaseApplication) application;
        if (baseApplication.getBaseALC().getHomeState() == null || baseApplication.getBaseALC().getHomeState() == ActivityState.DESTROYED) {
            //Do anything you want
        }
    }
}

https://developer.android.com/reference/android/app/Application.ActivityLifecycleCallbacks.html


1

নিশ্চিত না যে এটি "জিনিসগুলি" করার একটি "যথাযথ" উপায়।
আপনার (বা ক) প্রশ্নটি সমাধান করার কোনও এপিআই উপায় না থাকলে আপনার কিছুটা ভাবা উচিত, সম্ভবত আপনি কিছু ভুল করছেন এবং এর পরিবর্তে আরও ডকগুলি পড়ছেন ইত্যাদি
((আমি বুঝতে পারি যে স্থির ভেরিয়েবলগুলি অ্যান্ড্রয়েডের একটি সাধারণ ভুল উপায় cause কারণ) এটি কাজ করতে পারে, তবে এটি অবশ্যই কাজ করবে না যখন এটি কাজ করবে না (উদাহরণস্বরূপ, উত্পাদনে, মিলিয়ন ডিভাইসে])।
ঠিক আপনার ক্ষেত্রে আমি ভাবতে পরামর্শ দিচ্ছি যে অন্য ক্রিয়াকলাপ বেঁচে থাকলে আপনার জানা দরকার কেন ? .. ফলাফলটির কার্যকারিতা পেতে আপনি অন্য ক্রিয়াকলাপ শুরু করতে পারেন। অথবা আপনি ক্লাসটির কার্যকারিতা ইত্যাদি অর্জন করতে পারেন।
শুভেচ্ছান্তে.


1

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


1

অর্ডার করা সম্প্রচার ব্যবহার করুন। Http://android-developers.blogspot.nl/2011/01/ প্রসেসিং- অর্ডারড- ব্রডকাস্টগুলি html দেখুন

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


1

গৃহীত উত্তর ছাড়াও , আপনার যদি ক্রিয়াকলাপের একাধিক উদাহরণ থাকে তবে আপনি তার পরিবর্তে একটি কাউন্টার ব্যবহার করতে পারেন:

class MyActivity extends Activity {

     static int activeInstances = 0;

     static boolean isActive() {
        return (activeInstance > 0)
     }

      @Override
      public void onStart() {
         super.onStart();
         activeInstances++;
      } 

      @Override
      public void onStop() {
         super.onStop();
         activeInstances--;
      }
}

ফিরতি লাইনে "s" এবং "; (আধা কোলন)" অনুপস্থিত।
আলী_দেব

1

আপনি চেষ্টা করেছেন ..

    if (getActivity() instanceof NameOfYourActivity){
        //Do something
    }

0

নিম্নলিখিত কোড সহ একটি সহজ কাজ খুঁজে পেয়েছে

@Override 
protected void onCreate(Bundle savedInstanceState) { 
            super.onCreate(savedInstanceState); 
            if ((getIntent().getFlags() & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) != 0) { 
                // Activity is being brought to front and not being  created again, 
                // Thus finishing this activity will bring the last viewed activity to foreground
                finish(); 
            } 
    }

0

ক্রিয়াকলাপটি বেঁচে আছে কি না তা পরীক্ষা করতে ISActivity ভেরিয়েবলটি ব্যবহার করুন।

private boolean activityState = true;

 @Override
protected void onDestroy() {
    super.onDestroy();
    activityState = false;
}

তারপরে চেক করুন

if(activityState){
//add your code
}

0

আপনি যদি কার্যকলাপটি পিছনে স্ট্যাকের মধ্যে আছে কিনা তা পরীক্ষা করতে চান তবে কেবল পরবর্তী পদক্ষেপগুলি অনুসরণ করুন। 1. আপনার অ্যাপ্লিকেশন শ্রেণিতে একটি অ্যারেলিস্ট ঘোষণা করেছে [অ্যাপ্লিকেশন ক্লাসটি আপনার মেনস্টেস্ট ফাইলে অ্যাপ্লিকেশন ট্যাগে সংজ্ঞায়িত করা হয়েছে]

private ArrayList<Class> runningActivities = new ArrayList<>();
  1. এবং এই তালিকাটি অ্যাক্সেস এবং সংশোধন করতে নিম্নলিখিত পাবলিক পদ্ধতিগুলি যুক্ত করুন।

    public void addActivityToRunningActivityies (Class cls) {
    if (!runningActivities.contains(cls)) runningActivities.add(cls);
    }
    
    public void removeActivityFromRunningActivities (Class cls) {
    if (runningActivities.contains(cls)) runningActivities.remove(cls);
    }
    
    public boolean isActivityInBackStack (Class cls) {
    return runningActivities.contains(cls);
    }
  2. আপনার বেসঅ্যাক্টিভিটিতে, যেখানে সমস্ত ক্রিয়াকলাপগুলি এটি প্রসারিত করে, অনক্রিট এবং অনডস্ট্রয় পদ্ধতিগুলিকে ওভাররাইড করে যাতে আপনি নীচের মত ব্যাক স্ট্যাক থেকে ক্রিয়াকলাপগুলি যুক্ত করতে এবং মুছতে পারেন।

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    
    ((MyApplicationClass)getApplication()).addActivityToRunningActivityies
    (this.getClass());
    }
    
    @Override
    protected void onDestroy() {
    super.onDestroy();
    
    ((MyApplicationClass)getApplication()).removeActivityFromRunningActivities
    (this.getClass());
    }
  3. অবশেষে আপনি যদি কার্যকলাপটি পিছনের স্ট্যাকের মধ্যে আছে কিনা তা পরীক্ষা করতে চান বা না শুধুমাত্র এই ক্রিয়াকলাপটিকে ActivityInBackStack বলে।

উদাহরণস্বরূপ: আমি যাচাই করতে চাই হোমঅ্যাক্টিভিটি পিছনের স্ট্যাকের মধ্যে রয়েছে কিনা:

if (((MyApplicationClass) 
getApplication()).isActivityInBackStack(HomeActivity.class)) {
       // Activity is in the back stack
    } else {
       // Activity is not in the back stack
    }


-1

অগ্রভাগে যদি আপনার একই ক্রিয়াকলাপ না থাকে তবে এই কাজ করে। আপনি যদি বিজ্ঞপ্তি থেকে খোলেন কাজ না করে আমি কিছু সামঞ্জস্য করেছি এবং এটি নিয়ে এসেছি:

public static boolean ativo = false;
public static int counter = 0;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    ...
    counter++;
}

@Override
protected void onStart() {
    super.onStart();
    ativo = true;
}

@Override
protected void onStop() {
    super.onStop();
    if (counter==1) ativo = false;
}

@Override
protected void onDestroy() {
    counter--;
    super.onDestroy();
}

এটি একই সাথে বেশ কয়েকটি ক্রিয়াকলাপ খোলার সাথে আমার জন্য কাজ করে।

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