কোনও অ্যাপ্লিকেশনটির জন্য ক্রিয়াকলাপের স্ট্যাকের মধ্যে কোনও ক্রিয়াকলাপটি সর্বশেষ কিনা তা কীভাবে পরীক্ষা করবেন?


122

আমি জানতে চাই যে ব্যবহারকারীর বর্তমান ক্রিয়াকলাপটি থেকে বেরিয়ে আসলে তিনি হোম স্ক্রিনে ফিরে আসবেন কিনা।


1
এই শক্তি সহায়তা: stackoverflow.com/questions/2590581/activities-stack
bigstones

43
সবেমাত্র ক্রিয়াকলাপে ISTaskRoot নামক একটি ক্রিয়াকলাপ রয়েছে যা আমি অনুমান করি যে আপনার সাহায্য হতে পারে।
এইচ

উত্তর:


116

আপডেট (জুলাই 2015):

যেহেতু getRunningTasks () অবচিত হ'ল , 21 এপিআই থেকে রাউকড্র্যাগ উত্তর বা এড বার্নেটের একটি অনুসরণ করা ভাল (আমি দ্বিতীয়টি পছন্দ করব)।


অ্যাক্টিভিটি ম্যানেজার ব্যবহার করে বর্তমান কাজগুলি এবং তাদের স্ট্যাক চেক করার সম্ভাবনা রয়েছে ।

সুতরাং, কোনও ক্রিয়াকলাপ সর্বশেষ কিনা তা নির্ধারণ করতে:

  • ম্যানিফেস্টে android.permission.GET_TASKS অনুমতি অনুরোধ করুন।
  • নিম্নলিখিত কোড ব্যবহার করুন:

    ActivityManager mngr = (ActivityManager) getSystemService( ACTIVITY_SERVICE );
    
    List<ActivityManager.RunningTaskInfo> taskList = mngr.getRunningTasks(10);
    
    if(taskList.get(0).numActivities == 1 &&
       taskList.get(0).topActivity.getClassName().equals(this.getClass().getName())) {
        Log.i(TAG, "This is last activity in the stack");
    }

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



25
H9kDroid একটি সঠিক পরামর্শ দিয়েছে। নির্বাচিত উত্তরটি হ্যাক। isTaskRoot()পদ্ধতিটি ব্যবহার করে সঠিকভাবে এটি করা উচিত ।
সুফিয়ান

@ সুফিয়ান এটি বিশেষত হ্যাক কোথায়? কোডটি যৌক্তিক এবং ওপেন অ্যান্ড্রয়েড এপিআইগুলি যেভাবে তাদের ব্যবহারের উদ্দেশ্যে করা হয়েছে তা ব্যবহার করে (যেমন getRunningTasks চলমান কাজগুলি পেতে ব্যবহার করা উচিত এবং এই কাজগুলি বিশ্লেষণের উদ্দেশ্যে কেউ কেবল এটি কল করতে চাইতে পারে)। গেটের ব্যবহার (0) ভাল নথিভুক্ত এবং যৌক্তিক 'বর্তমানে চলমান কাজগুলির একটি তালিকা ফিরিয়ে দিন, সর্বাধিক সাম্প্রতিক ক্রমে প্রথমে এবং বয়স্কদের সাথে'।
সান্দারস্টার

2
getRunningTasks () এপিআই স্তরের 21
অবমুক্ত করা হয়েছে।

আমি কি টুকরোগুলির জন্য একই জিনিস করতে পারি? যদি হ্যাঁ তবে কীভাবে? দয়া করে সহায়তা করুন
সাগর দেবঙ্গা

1
@ মিঃ ড্রু @ রাকোড্রাগ থেকে সর্বাধিক ভোট প্রাপ্ত উত্তর দেখুন
ডেভিড ওয়াসার

167

আমি এইচটিএমএইচড্রয়েডের মন্তব্য এখানে পোস্ট করতে চলেছি এমন লোকদের জন্য এখানে একই উত্তর answer

ক্রিয়াকলাপটি কোনও কাজের মূল কিনা তা জানতে আপনি ইসটাকরুট () ব্যবহার করতে পারেন ।

আশা করি এটা কাজে লাগবে


1
আপনি কি দয়া করে একক লাইন কোড সরবরাহ করতে পারেন যাতে এটি কীভাবে টাস্করুট ব্যবহার করবেন সে সম্পর্কে এটি পরিষ্কার। ধন্যবাদ।
কাভিশ কানওয়াল

18
@ if (isTaskRoot()) { // do something }
দ্য

3
একমাত্র সমস্যাটি হল <= 4.4 এ আমি এটি> = 5.x এর চেয়ে আলাদা আচরণ করতে দেখছি। এটি সর্বদা মিথ্যা প্রত্যাবর্তন বলে মনে হয়।
চুবসনডাবস

আমি মনে করি আপনার ভবিষ্যতের পাঠকদের পক্ষে আরও সহজ করার জন্য মন্তব্যে প্রদত্ত নমুনা কোডটি উত্তরের মধ্যে অন্তর্ভুক্ত করার বিষয়টি বিবেচনা করা উচিত।
ইসাক

চমৎকার উত্তর। আমার ক্ষেত্রে ব্যবহারকারী কোনও বিজ্ঞপ্তিতে ক্লিক করার পরে যদি তারা আগে অ্যাপ্লিকেশনটি বন্ধ করে দেয় তবে কার্যকলাপটি মূল হতে পারে
ডেভ ও গ্রেডি

19

আশা করি এটি নতুন নতুনদের সহায়তা করবে, উপরের উত্তরগুলির ভিত্তিতে যা আমার পক্ষে সূক্ষ্মভাবে কাজ করে, আমি কোড স্নিপেটও ভাগ করে নিচ্ছি যাতে এটি কার্যকর করা সহজ হবে।

সমাধান: আমি ব্যবহার করেছি isTaskRoot()যা সত্য ফিরে আসে যদি বর্তমানের ক্রিয়াকলাপটি কেবল আপনার স্ট্যাকের ক্রিয়াকলাপ এবং অন্যটি আমি পরিচালনা করি তবে আমার যদি স্ট্যাকের কিছু ক্রিয়াকলাপ থাকে তবে নতুন কাস্টমটি না খোলার পরিবর্তে স্ট্যাকের শেষ ক্রিয়ায় যান

আপনার ক্রিয়াকলাপে

   @Override
    public void onBackPressed() {

        if(isTaskRoot()){
            startActivity(new Intent(currentActivityName.this,ActivityNameYouWantToOpen.class));
            // using finish() is optional, use it if you do not want to keep currentActivity in stack
            finish();
        }else{
            super.onBackPressed();
        }

    }


5

যদিও এটি অর্জনের জন্য কোনও উপায় থাকতে পারে (অন্যান্য উত্তর দেখুন) আমি আপনাকে পরামর্শ দিচ্ছি যে এটি করা উচিত নয়। হোম অ্যান্ড্রয়েড অ্যাপ্লিকেশনগুলিকে হোম স্ক্রিনটি প্রদর্শন করতে চলেছে কিনা তা জানা দরকার নেই।

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


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

2
যদি কোনও পটভূমি পরিষেবা কোনও ক্রিয়াকলাপ শুরু করে, সম্ভবত আপনি স্ট্যাকের একমাত্র ক্রিয়াকলাপ কিনা তা জানতে চাইবেন।
ম্যাট ডাব্লু

4

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

আপনি যখনই কোনও নতুন কার্যকলাপ শুরু করবেন, মার্কারটি সন্নিবেশ করুন:

newIntent=new Intent(this, NextOne.class);
newIntent.putExtra(this.getPackageName()+"myself", 0);
startActivity(newIntent);

এবং তারপরে আপনি এটির জন্য এটি পরীক্ষা করতে পারেন:

boolean islast=!getIntent().hasExtra(this.getPackageName()+"myself")

1
ক্রিয়াকলাপটি মারা গেলে এবং ক্রিয়াকলাপের স্ট্যাকটি পুনর্গঠন করা হলে কাজ করে না - প্রতিটি ক্রিয়াকলাপ চাহিদা অনুসারে।
অ্যালিকেলিন-কিলাকা

3

স্যান্ডারস্টারের সমাধান ব্যবহার করে সমস্যাটি ActivityManagerহ'ল: এইভাবে কাজগুলি পাওয়ার জন্য আপনার অনুমতি দরকার। আমি একটি ভাল উপায় খুঁজে পেয়েছি:

getIntent().hasCategory(Intent.CATEGORY_LAUNCHER)

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

Intent intent = new Intent(startingActivity, SomeActivityClass.class);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
activity.startActivity(intent);

ক্রিয়াকলাপটি পুশ বিজ্ঞপ্তি থেকে খোলা থাকলে কী হবে? তাদের
ক্যাটাগরি লঞ্চ নেই

আমি নিশ্চিত যে আমার উত্তরের দ্বিতীয় অংশটি এখনও প্রযোজ্য। আপনি অভিপ্রায় হিসাবে একটি বিভাগ হিসাবে একটি বিভাগ সেট করতে পারেন। এক্ষেত্রে আপনার বিজ্ঞপ্তি প্রসঙ্গে হতে পারে। এগুলি ছাড়াও আপনি এর জন্য পতাকা ব্যবহার করতে পারেন। সাথে অভিপ্রায় একটি বিজ্ঞপ্তি সৃষ্টির জন্য এই লিঙ্কটি দেখতে stackoverflow.com/questions/13716723/...
উ: Binzxxxxxx

তবুও, যদি আপনার প্রাচীনতম ক্রিয়াকলাপটি MainActivity হয় এবং এখন এটি আবার চালু করা হয়, এবং তারপরে আপনি পুশ বিজ্ঞপ্তি পান এবং আপনি CATEGORY_LAUNCHER এর সাথে খোলার জন্য মুলতুবিটি সেট করেছেন, তবে আপনার এই বিভাগের সাথে 2 টি ক্রিয়াকলাপ হবে। সম্ভবত বিভিন্ন কাজে সম্ভবত
nbtk

এটি বিজ্ঞপ্তিগুলির সাথে কীভাবে কাজ করে তা আমি নিশ্চিত নই। আপনি এখানে এটি করার মতো আমি তাদের কখনই ব্যবহার করি নি। আমি নিশ্চিত যে এই পদ্ধতির সাথে এটি করার সহজ উপায় আছে তবে আমি ২০১৪ এর কিউর পর থেকে অ্যান্ড্রয়েড কোডটি স্পর্শ করি নি Maybe সম্ভবত আপনি এই ক্ষেত্রে দ্বিতীয় বিভাগটি ব্যবহার করতে চান? নাকি কিছু পতাকা? তবে আমি অনুমান করি যে এটির মতো কাজ করা ment মূল ক্রিয়াকলাপটি শুরু করার সাথে সাথে সঠিক ক্রিয়াকলাপটি খোলার জন্য কোনও ধরণের মেটা তথ্য যুক্ত করার বিষয়ে কীভাবে?
উ: Binzxxxxxx

2

আমি আমার সমস্ত ক্রিয়াকলাপের জন্য একটি বেস ক্লাস তৈরি করেছি, অ্যাপকম্প্যাটঅ্যাক্টিভিটি প্রসারিত করেছি এবং যার স্ট্যাটিক কাউন্টার রয়েছে:

public abstract class BasicActivity extends AppCompatActivity {
    private static int activityCounter = 0;

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

    @Override
    public void onDestroy() {
        super.onDestroy();
        --activityCounter;
        if(activityCounter==0) {
            // Last instance code...
        }
    }

    public boolean isLastInstance() { return (activityCounter==1); }
}

এটি এখন পর্যন্ত যথেষ্ট ভাল কাজ করেছে; এবং এপিআই সংস্করণ নির্বিশেষে। এটি অবশ্যই প্রয়োজন যে সমস্ত ক্রিয়াকলাপ এই বেস শ্রেণিকে প্রসারিত করে - যা তারা আমার ক্ষেত্রে করে।

সম্পাদনা করুন: অ্যাপটি সম্পূর্ণরূপে প্রস্থান হওয়ার আগে যখন কাউন্টারটি শূন্যে চলে যায় তখন আমি একটি উদাহরণ লক্ষ্য করেছি, এটি যখন অভিমুখ পরিবর্তন হয় এবং কেবলমাত্র একটি ক্রিয়াকলাপ খোলা থাকে। যখন অরিয়েন্টেশন পরিবর্তন হয়, ক্রিয়াকলাপটি বন্ধ হয়ে যায় এবং অন্যটি তৈরি হয়, তাই onDestroyedশেষ ক্রিয়াকলাপের onCreateজন্য বলা হয় এবং তারপরে পরিবর্তিত ওরিয়েন্টেশন সহ একই ক্রিয়াকলাপটি তৈরি করা হয়। এই আচরণ অবশ্যই জবাবদিহি করতে হবে; ওরিয়েন্টেশনএভেন্টলিস্টনার সম্ভবত ব্যবহার করা যেতে পারে।


0

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


9
এটি কাজ করবে না যেহেতু getCallingActivity () অ্যাক্টিভিটি স্টার্টঅ্যাক্টিভিটি ফর রিসাল্ট () এর মাধ্যমে চালু না করা হলে ফিরে আসবে।
এইচ

0

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

তদতিরিক্ত, আপনি নিশ্চিত হতে পারবেন না যে "সাম্প্রতিক ক্রিয়াকলাপ" তালিকা থেকে আপনার ক্রিয়াকলাপ শুরু করা খোলার ক্রিয়াকলাপের উদ্দেশ্যে কিছু অতিরিক্ত ডেটা সেট করার মাধ্যমে সনাক্ত করা যেতে পারে, কারণ এটি ক্ষেত্রে পুনরায় ব্যবহার করা হচ্ছে used

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