আমি জানতে চাই যে ব্যবহারকারীর বর্তমান ক্রিয়াকলাপটি থেকে বেরিয়ে আসলে তিনি হোম স্ক্রিনে ফিরে আসবেন কিনা।
আমি জানতে চাই যে ব্যবহারকারীর বর্তমান ক্রিয়াকলাপটি থেকে বেরিয়ে আসলে তিনি হোম স্ক্রিনে ফিরে আসবেন কিনা।
উত্তর:
আপডেট (জুলাই 2015):
যেহেতু getRunningTasks () অবচিত হ'ল , 21 এপিআই থেকে রাউকড্র্যাগ উত্তর বা এড বার্নেটের একটি অনুসরণ করা ভাল (আমি দ্বিতীয়টি পছন্দ করব)।
অ্যাক্টিভিটি
ম্যানেজার ব্যবহার করে বর্তমান কাজগুলি এবং তাদের স্ট্যাক চেক করার সম্ভাবনা রয়েছে ।
সুতরাং, কোনও ক্রিয়াকলাপ সর্বশেষ কিনা তা নির্ধারণ করতে:
নিম্নলিখিত কোড ব্যবহার করুন:
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");
}
দয়া করে মনে রাখবেন, উপরের কোডটি কেবলমাত্র আপনার একক কাজ থাকলে বৈধ হবে। আপনার অ্যাপ্লিকেশনের জন্য যদি সম্ভাব্য কাজগুলির সংখ্যা বিদ্যমান থাকে - আপনার অন্যান্য টাস্কলিস্টের উপাদানগুলি পরীক্ষা করতে হবে । টাস্ক এবং ব্যাক স্ট্যাক সম্পর্কে আরও পড়ুন
isTaskRoot()
পদ্ধতিটি ব্যবহার করে সঠিকভাবে এটি করা উচিত ।
আমি এইচটিএমএইচড্রয়েডের মন্তব্য এখানে পোস্ট করতে চলেছি এমন লোকদের জন্য এখানে একই উত্তর answer
ক্রিয়াকলাপটি কোনও কাজের মূল কিনা তা জানতে আপনি ইসটাকরুট () ব্যবহার করতে পারেন ।
আশা করি এটা কাজে লাগবে
if (isTaskRoot()) { // do something }
আশা করি এটি নতুন নতুনদের সহায়তা করবে, উপরের উত্তরগুলির ভিত্তিতে যা আমার পক্ষে সূক্ষ্মভাবে কাজ করে, আমি কোড স্নিপেটও ভাগ করে নিচ্ছি যাতে এটি কার্যকর করা সহজ হবে।
সমাধান: আমি ব্যবহার করেছি 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();
}
}
এর একটি সহজ সমাধান রয়েছে, আপনি আপনার ক্রিয়াকলাপে টাস্করুট () ব্যবহার করতে পারেন
যদিও এটি অর্জনের জন্য কোনও উপায় থাকতে পারে (অন্যান্য উত্তর দেখুন) আমি আপনাকে পরামর্শ দিচ্ছি যে এটি করা উচিত নয়। হোম অ্যান্ড্রয়েড অ্যাপ্লিকেশনগুলিকে হোম স্ক্রিনটি প্রদর্শন করতে চলেছে কিনা তা জানা দরকার নেই।
আপনি যদি ডেটা সংরক্ষণের চেষ্টা করছেন, আপনার অনপজ () পদ্ধতিতে ডেটা সেভিং কোডটি রেখে দিন। যদি আপনি ব্যবহারকারীর বিদ্যমান অ্যাপ্লিকেশনটি সম্পর্কে তাদের মতামত পরিবর্তনের জন্য কোনও উপায় দেওয়ার চেষ্টা করছেন, আপনি ব্যাক কী এবং অনব্যাকপ্রেসড () পদ্ধতিটির জন্য কীটি উপরে / ডাউন বাধা দিতে পারেন এবং একটি "আপনি কি নিশ্চিত?" শীঘ্র.
এটির নজর রাখার একটি উপায় হ'ল আপনি কোনও নতুন ক্রিয়াকলাপ শুরু করার সময় কোনও চিহ্নিতকারীকে অন্তর্ভুক্ত করা এবং চিহ্নিতকারী উপস্থিত রয়েছে কিনা তা পরীক্ষা করা।
আপনি যখনই কোনও নতুন কার্যকলাপ শুরু করবেন, মার্কারটি সন্নিবেশ করুন:
newIntent=new Intent(this, NextOne.class);
newIntent.putExtra(this.getPackageName()+"myself", 0);
startActivity(newIntent);
এবং তারপরে আপনি এটির জন্য এটি পরীক্ষা করতে পারেন:
boolean islast=!getIntent().hasExtra(this.getPackageName()+"myself")
স্যান্ডারস্টারের সমাধান ব্যবহার করে সমস্যাটি ActivityManager
হ'ল: এইভাবে কাজগুলি পাওয়ার জন্য আপনার অনুমতি দরকার। আমি একটি ভাল উপায় খুঁজে পেয়েছি:
getIntent().hasCategory(Intent.CATEGORY_LAUNCHER)
Activity
স্ট্যাক নীচে সর্বদা ডিফল্টরূপে এই বিষয়শ্রেণীতে পেতে যখন অন্যান্য কার্যক্রম তা না পাওয়া উচিত উচিত নয়।
তবে এটি যদি কিছু ডিভাইসে ব্যর্থ হয় তবে আপনি এটি শুরু করার সময় সেট করতে পারেন Activity
:
Intent intent = new Intent(startingActivity, SomeActivityClass.class);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
activity.startActivity(intent);
আমি আমার সমস্ত ক্রিয়াকলাপের জন্য একটি বেস ক্লাস তৈরি করেছি, অ্যাপকম্প্যাটঅ্যাক্টিভিটি প্রসারিত করেছি এবং যার স্ট্যাটিক কাউন্টার রয়েছে:
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
জন্য বলা হয় এবং তারপরে পরিবর্তিত ওরিয়েন্টেশন সহ একই ক্রিয়াকলাপটি তৈরি করা হয়। এই আচরণ অবশ্যই জবাবদিহি করতে হবে; ওরিয়েন্টেশনএভেন্টলিস্টনার সম্ভবত ব্যবহার করা যেতে পারে।
অ্যান্ড্রয়েড কার্যকরী একটি ভ্রমণ স্ট্যাক, আমি আপনাকে পরামর্শ দিচ্ছি আপনি এটি সম্পর্কে পড়তে এখানে । এটা সব মত যদিও কলিং কার্যকলাপ উদ্ধার কাজ করতে চান দেখায়: getCallingActivity()
। যদি বর্তমান ক্রিয়াকলাপটি আপনার অ্যাপ্লিকেশনটির প্রথম ক্রিয়াকলাপ হয় এবং হোম স্ক্রীন থেকে অ্যাপ্লিকেশনটি চালু করা হয়েছিল তবে এটি (আমি ধরে নিই) ফিরে আসা উচিত null
।
এখানে থাকা একটি জিনিসটি হ'ল "হোম কী" ক্লিক, সক্রিয় হওয়ার পরে আপনি আপনার ক্রিয়াকলাপ থেকে এটি সনাক্ত করতে পারবেন না, তাই "ব্যাক কী" টিপুন পরিচালনা করে প্রয়োজনীয় ক্রিয়াকলাপে চলে যাওয়া বা প্রোগ্রামিংক্রমে ক্রিয়াকলাপের স্ট্যাক নিয়ন্ত্রণ করা ভাল or শুধু প্রয়োজনীয় পদক্ষেপ করা।
তদতিরিক্ত, আপনি নিশ্চিত হতে পারবেন না যে "সাম্প্রতিক ক্রিয়াকলাপ" তালিকা থেকে আপনার ক্রিয়াকলাপ শুরু করা খোলার ক্রিয়াকলাপের উদ্দেশ্যে কিছু অতিরিক্ত ডেটা সেট করার মাধ্যমে সনাক্ত করা যেতে পারে, কারণ এটি ক্ষেত্রে পুনরায় ব্যবহার করা হচ্ছে used