প্রথমত, আমি জানি যে অ্যান্ড্রয়েডে কোনও অ্যাপ্লিকেশন সত্যই হত্যা করা / পুনরায় চালু করা উচিত নয়। আমার ব্যবহারের ক্ষেত্রে আমি কোনও নির্দিষ্ট ক্ষেত্রে আমার অ্যাপ্লিকেশনটি কারখানার পুনরায় সেট করতে চাই যেখানে কোনও সার্ভার ক্লায়েন্টকে নির্দিষ্ট তথ্য প্রেরণ করে।
ব্যবহারকারীর কেবলমাত্র অ্যাপ্লিকেশনের এক উদাহরণ দিয়ে সার্ভারে লগ ইন করা যেতে পারে (যেমন একাধিক ডিভাইস অনুমোদিত নয়)। যদি অন্য কোনও উদাহরণটি "লগ-ইন" -লোক পায় তবে সেই ধারাবাহিকতা বজায় রাখতে ব্যবহারকারীর সমস্ত অন্যান্য দৃষ্টান্ত তাদের ডেটা (ফ্যাক্টরি-রিসেট) মুছতে হবে।
জোর করে লক পাওয়া সম্ভব, কারণ ব্যবহারকারীর অ্যাপটি মুছে ফেলা এবং এটি পুনরায় ইনস্টল করতে পারে যার ফলশ্রুতিতে অন্যরকম আইডি-আইডি আসে এবং ব্যবহারকারী আর লকটি মুক্ত করতে সক্ষম হয় না। অতএব জোর করে লক পাওয়া সম্ভব।
সেই জোর-সম্ভাবনার কারণে আমাদের সর্বদা একটি কংক্রিট উদাহরণ পরীক্ষা করা দরকার যে এটিতে লক রয়েছে। এটি সার্ভারের প্রতিটি অনুরোধে (প্রায়) সম্পন্ন হয়। সার্ভারটি একটি "ভুল-লক-আইডি" প্রেরণ করতে পারে। যদি এটি সনাক্ত হয়, ক্লায়েন্ট অ্যাপ্লিকেশন অবশ্যই সবকিছু মুছে ফেলবে।
এটাই ছিল ইউস-কেস।
আমার একটি Activity
এ আছে যা লগইন Activity
এল বা অ্যাপটির মূল শুরু করে startsActivity
বি ভাগ করে নেওয়া মূল্যগুলির উপর নির্ভর করে শুরু করে। এল বা বি শুরু করার পরে এটি নিজেকে বন্ধ করে দেয় যাতে কেবলমাত্র এল বা বি চলছে। ব্যবহারকারী ইতিমধ্যে লগ ইন করা ক্ষেত্রে এখন বি চলছে।
বি সি সি শুরু startService
করেIntentService
ডি যা এই স্ট্যাকের ফলস্বরূপ:
(ক)> বি> সি> ডি
ডি-এর হ্যান্ডলিআইন্টেন্ট পদ্ধতি থেকে একটি ইভেন্ট একটি ফলাফল রেজিসিভারে প্রেরণ করা হয় ।
আর এখন সেই ইভেন্টটি ব্যবহারকারীকে একটি ডায়ালগ সরবরাহের মাধ্যমে পরিচালনা করে যেখানে তিনি অ্যাপ্লিকেশনটি ফ্যাক্টরি-রিসেট করতে বেছে নিতে পারেন (ডাটাবেস, শেয়ারডপ্রিফগুলি মুছুন))
ফ্যাক্টরি পুনরায় সেট করার পরে আমি অ্যাপ্লিকেশনটি পুনরায় চালু করতে চাই (সমস্ত ক্রিয়াকলাপ বন্ধ করতে) এবং কেবলমাত্র আবার একটি শুরু করতে চান যা লগইন Activity
এল চালু করে এবং নিজেই শেষ করে:
(ক)> এল
ডায়ালগের অনক্লিক-পদ্ধতিটি দেখতে এরকম দেখাচ্ছে:
@Override
public void onClick(DialogInterface dialog, int which) {
// Will call onCancelListener
MyApplication.factoryReset(); // (Deletes the database, clears sharedPrefs, etc.)
Intent i = new Intent(MyApp.getContext(), A.class);
i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
MyApp.getContext().startActivity(i);
}
এবং এটি MyApp
ক্লাস:
public class MyApp extends Application {
private static Context context;
@Override
public void onCreate() {
super.onCreate();
context = getApplicationContext();
}
public static Context getContext() {
return context;
}
public static void factoryReset() {
// ...
}
}
সমস্যাটি হ'ল যদি আমি FLAG_ACTIVITY_NEW_TASK
ক্রিয়াকলাপগুলি বি এবং সি ব্যবহার করি তবে এখনও চলছে। আমি লগইনে পিছনের বোতামটি চাপলে Activity
আমি সি দেখতে পাই তবে আমি হোম স্ক্রিনে ফিরে যেতে চাই।
যদি আমি সেট না FLAG_ACTIVITY_NEW_TASK
করি তবে আমি ত্রুটিটি পেয়েছি:
07-07 12:27:12.272: ERROR/AndroidRuntime(9512): android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?
আমি ক্রিয়াকলাপগুলি ব্যবহার করতে পারি না Context
, কারণ ServiceIntent
ডি একটি পটভূমি টাস্ক থেকে ডেকেও আসতে পারে যা দ্বারা শুরু করা হয়েছিল AlarmManager
।
তাহলে আমি কীভাবে এটিকে ক্রিয়াকলাপের স্ট্যাক (এ)> এল হয়ে উঠতে পারি?