অ্যান্ড্রয়েডে সোয়াইপ করে অ্যাপটি মারা গেলে কীভাবে কোড পরিচালনা করবেন?


104

যদি আমার অ্যাপ্লিকেশনটি চলমান থাকে এবং আমি হোম বোতাম টিপুন তবে অ্যাপটি ব্যাকগ্রাউন্ডে চলে in এখন একটি দীর্ঘ প্রেস হোম বোতাম এবং সাম্প্রতিক অ্যাপ্লিকেশন তালিকা থেকে এটা সোয়াইপ করার মাধ্যমে অ্যাপ্লিকেশান বন্ধ করে, ঘটনা কেউই পছন্দ onPause(), onStop()বা onDestroy()বরং বলা পরার প্রক্রিয়া সমাপ্ত করা হয়। সুতরাং আমি যদি আমার পরিষেবাগুলি বন্ধ করতে, বিজ্ঞপ্তিগুলি মেরে এবং শ্রোতাদের নিবন্ধিত করতে চাই, তবে আমি কীভাবে এটি করতে পারি? আমি বেশ কয়েকটি নিবন্ধ এবং ব্লগ পড়েছি কিন্তু কোনও দরকারী তথ্য পাইনি এবং এটি সম্পর্কে কোনও নথিও পাই নি। কোন সাহায্য প্রশংসা করা হবে। আগাম ধন্যবাদ.


আমি আমার সমস্যা সমাধান। চেক করুন
মাইস্টিক ম্যাজিকϡ

@ মিস্টিকম্যাগিক যা কোনও পরিষেবার জন্য কাজ করে, বিজ্ঞপ্তি বাতিল এবং নিবন্ধন না করা শ্রোতাদের কী হবে?
কোডওয়ারিওর

আপনি শ্রোতাদের অন টাস্কের সরানোতে নিবন্ধভুক্ত করতে পারেন। পারছিনা? বিজ্ঞপ্তি বাতিল করার জন্যও একই
MysticMagicϡ

@ মাইস্টিক ম্যাজিক- আমি যদি অ্যাপ আপডেটে একই জিনিস করতে চাই?
রেজি 20'15

উত্তর:


150

আমি ঠিক একই ধরণের সমস্যা সমাধান করেছি।

সাম্প্রতিক অ্যাপ্লিকেশন তালিকা থেকে অদলবদল করে অ্যাপ্লিকেশনটি মারা গেলে আপনি পরিষেবাটি বন্ধ করার বিষয়ে যদি এটি করতে পারেন তবে তা এখানে ।

আপনার ফাইল ভিতরে, পতাকা রাখা stopWithTaskযেমন trueসার্ভিসের। ভালো লেগেছে:

<service
    android:name="com.myapp.MyService"
    android:stopWithTask="true" />

তবে আপনি যেমনটি বলেছেন যে আপনি শ্রোতাদের নিবন্ধন করতে চান এবং বিজ্ঞপ্তি ইত্যাদি বন্ধ করতে চান, আমি এই পদ্ধতির পরামর্শ দেব:

  1. আপনার ফাইল ভিতরে, পতাকা রাখা stopWithTaskযেমন falseসার্ভিসের। ভালো লেগেছে:

    <service
        android:name="com.myapp.MyService"
        android:stopWithTask="false" />
  2. এখন আপনার MyServiceপরিষেবাতে, ওভাররাইড পদ্ধতি onTaskRemoved। ( stopWithTaskসেট করা থাকলে এটিই বরখাস্ত করা হবে false)।

    public void onTaskRemoved(Intent rootIntent) {
    
        //unregister listeners
        //do any other cleanup if required
    
        //stop service
        stopSelf();  
    }

পড়ুন আমার প্রশ্ন আরো বিস্তারিত জানার জন্য, যা কোডের অন্যান্য অংশ রয়েছে, খুব।

আশাকরি এটা সাহায্য করবে.


ধন্যবাদ। সোয়েপ কিল সনাক্তকরণে এই পদ্ধতিটি ব্যবহার করা যেতে পারে কিনা তা ভেবে। সাধারণ ফাঁকা পরিষেবা?
কিরণ

হ্যাঁ @ কিরান আপনি চেষ্টা করতে পারেন। :)
মাইস্টিক ম্যাজিকϡ

1
@ মাইস্টিক ম্যাজিকϡ হাই, আমি আপনার সমাধানটি ব্যবহার করার চেষ্টা করেছি, তবে এটি দীর্ঘ অপারেশন যেমন সার্ভারে ডেটা প্রেরণ, গুগলে বিশ্লেষণ ইত্যাদির মতো মনে হয় কিছু সময় পুরোপুরি ব্যর্থ হয়। এই পদ্ধতিটি সম্পূর্ণরূপে সম্পূর্ণরূপে সুযোগ পাওয়ার আগেই কি প্রক্রিয়াটি মারা যায়? এছাড়াও আপনি কি হুয়াওয়ে ডিভাইসে এই পদ্ধতিটি ব্যবহার করে দেখেছেন? এটি অন টাস্কআরিভেড ডিভাইসে কখনও কল হয় না বলে মনে হয়। কোন ধারণা কেন?
অ্যালন মিনস্কি

2
@ MysticMagicϡ পাবলিক অকার্যকর onTaskRemoved (..) অ্যান্ড্রয়েড মন্ত্রণালয় মধ্যে অন্যান্য OS এ অ্যান্ড্রয়েড মন্ত্রণালয় ওয়ার্কিং জরিমানা কিন্তু পেয়ে ইস্যু কল না পদ্ধতি
জে প্যাটেলের

2
ব্যাকগ্রাউন্ড পরিষেবার সীমাবদ্ধতার কারণে এই কোডটি অ্যান্ড্রয়েড ওয়ের জন্য কাজ করছে না। সমস্ত অ্যান্ড্রয়েড ডিভাইসে এটি হ্যান্ডেল করার কোনও উপায় আছে কি?
Aanal মেহতা

33

এটি করার একটি উপায় খুঁজে পেয়েছি

এই মত একটি পরিষেবা করুন

public class OnClearFromRecentService extends Service {

@Override
public IBinder onBind(Intent intent) {
    return null;
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    Log.d("ClearFromRecentService", "Service Started");
    return START_NOT_STICKY;
}

@Override
public void onDestroy() {
    super.onDestroy();
    Log.d("ClearFromRecentService", "Service Destroyed");
}

@Override
public void onTaskRemoved(Intent rootIntent) {
    Log.e("ClearFromRecentService", "END");
    //Code here
    stopSelf();
}

}

2) এই পরিষেবাটি ম্যানিফেস্ট.এক্সএমএলতে নিবন্ধ করুন

<service android:name="com.example.OnClearFromRecentService" android:stopWithTask="false" />

3) তারপরে আপনার স্প্ল্যাশ কার্যকলাপে এই পরিষেবাটি শুরু করুন

startService(new Intent(getBaseContext(), OnClearFromRecentService.class));

এবং এখনই যখনই আপনি আপনার অ্যাপ্লিকেশনটি অ্যান্ড্রয়েড থেকে সাম্প্রতিক সময়ে সরিয়ে ফেলবেন তখন এই পদ্ধতি অন টাস্করেমভড () কার্যকর করবে)


1
: এক কপি এক এবং এই উত্তর থেকে পেস্ট stackoverflow.com/questions/21040339
Flot2011

17

আমি অনুরূপ সমস্যা সমাধান করেছি। আপনি যদি সাম্প্রতিক টাস্ক থেকে স্যুইপ করার পরে এবং পরবর্তী লঞ্চটি সঠিকভাবে আচরণ করতে চান তবে নীচের পদক্ষেপগুলি অনুসরণ করুন: -

1) ভাগ করা পছন্দগুলিতে প্রক্রিয়া আইডি সংরক্ষণ করুন:

SharedPreferencesUtils.getInstance().putInt(SharedPreferencesUtils.APP_PROCESS_ID, android.os.Process.myPid());

২) যখন সাম্প্রতিক কাজটি পরিষ্কার হয়ে যাওয়ার পরে লঞ্চার থেকে অ্যাপ্লিকেশন চালু করা হয় তখন তা করুন:

int previousProcessID = mSharedPreferencesUtils.getInt(SharedPreferencesUtils.APP_PROCESS_ID);

int currentProcessID = android.os.Process.myPid();

if ((previousProcessID == currentProcessID)) {
    // This ensures application not killed yet either by clearing recent or anyway
} else {
    // This ensures application killed either by clearing recent or by anyother means
}

নিশ্চিত - অ্যান্ড্রয়েড 8 এ সার্ভিস ছাড়াই ব্যবহার করা হয়েছে T টাস্করমিভড () - সুন্দরভাবে সম্পন্ন হয়েছে
গাল রোম

4
এই সমাধানটি কেবল অ্যাপটিকে পুনরায় চালু করা হয়েছে কিনা তা সনাক্ত করে তবে অ্যাপটি মেরে ফেলার
সময়টি

6

আপনি যখন বাড়িতে চাপুন - onPauseএবং onStopআপনার ক্রিয়াকলাপটি কল করা হচ্ছে, সুতরাং এই মুহুর্তে আপনাকে সমস্ত সঞ্চয় এবং ক্লিনআপ করতে হবে, কারণ অ্যান্ড্রয়েড প্ল্যাটফর্মটি গ্যারান্টি দেয় না onDestroyবা অন্য কোনও লাইফসাইক্যাল পদ্ধতিটি আহ্বান করা হবে, সুতরাং প্রক্রিয়াটি হত্যার চেষ্টা করা যেতে পারে কোনও বিজ্ঞপ্তি ছাড়াই


12
পরামর্শের জন্য ধন্যবাদ, কিন্তু আমি আমার বিজ্ঞপ্তি, সেবা এবং লিসেনারের হত্যা না চাও, উপর onPause()এবং onstop()তারা নিহত কেবল তখন ব্যবহারকারী প্রস্থান করে অ্যাপ্লিকেশন অর্থাত লগ আউট প্রয়োজন।
কোডওয়ারিওর

1

কল করার সময় আপনার ডেটা সংরক্ষণ করা দরকার onPause()। এই জীবনচক্র চিত্রটি দেখুন: অ্যান্ড্রয়েড বিকাশকারী

আপনি দেখতে পাচ্ছেন যে কোনও অ্যাপ্লিকেশন মারা যেতে পারে onPause()বা এর পরেও onStop()

সেখানে আপনার তথ্য কীভাবে পরিচালনা এবং তা পুনরুদ্ধার onRestart()\ onCreate()

শুভকামনা!


1

আপনি সোয়াইপ পরিচালনা করতে পারবেন না কারণ সিস্টেম কোনও কলব্যাক কল না করে কেবল মেমরি থেকে আপনার প্রক্রিয়া সরিয়ে দেয়।

আমি দেখেছি, ব্যবহারকারী "সাম্প্রতিক অ্যাপ্লিকেশন" স্ক্রিন কল করার আগে অনপেজ () সর্বদা ডাকা হবে। সুতরাং আপনার ফিজিশিং () পরীক্ষা না করেই অনপজ পদ্ধতিতে সমস্ত ডেটা সংরক্ষণ করতে হবে।

পিছনে বোতামটি পরীক্ষা করতে, অনব্যাকপ্রেসড পদ্ধতিটি ব্যবহার করুন।


1
আমি বিশ্বাস করি সমস্ত অ্যান্ড্রয়েড সংস্করণগুলির জন্য এটিই একমাত্র নিরাপদ পদ্ধতি।
সেরজিও

@ সার্জিও হ্যাঁ এটি সবচেয়ে নিরাপদ পদ্ধতি এবং আমি এটি বৃহত্তর স্কেল অ্যাপ্লিকেশনটিতে পরীক্ষা করেছি।
আহমদ

1

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

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

ভিউমোডেলটি ব্যবহারের এটি আরও অনেক ভাল কারণ।

- বব


1

আমি সত্যিই জানিনা কেন উপরে পন্থা আমার ক্ষেত্রে আমি এমনকি সেটে কাজ করছে না কি android:stopWithTask="false"যে onTaskRemoved()বলা হয় না।

আরেকটি ভাল পদ্ধতির ব্যবহার করা হবে AndroidViewModel। ব্যবহারকারী যখন পিছনে বোতাম টিপে অ্যাপ্লিকেশনটি থেকে প্রস্থান করেন তখন এটি এক ক্ষেত্রেও কাজ করে।

আপনার ক্লাসব্যাকটি কেবল তখন ViewModelক্লাসে আবদ্ধ ।MainActivityonCleared()

উদাহরণ:

public class MainViewModel extends AndroidViewModel {
    public MainViewModel(@NonNull Application application) {
        super(application);
    }

    @Override
    protected void onCleared() {
        // Do your task here
        Log.e("MainViewModel", "OnCleared mainViewModel");
        super.onCleared();
    }
}

তারপরে এটি আপনার মূল কার্যকলাপের সাথে আবদ্ধ করুন:

MainViewModel viewModel = new ViewModelProvider(this).get(MainViewModel.class);

~ ভয়েলা!


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

হ্যাঁ এটি
কার্যকরভাবে

0

এটি অ্যান্ড্রয়েড 6,7,8,9 এ আমার জন্য কাজ করেছে।

এর মতো একটি পরিষেবা করুন:

 public class OnClearFromRecentService extends Service {

 @Override public IBinder onBind(Intent intent) {
     return null; }

 @Override public int onStartCommand(Intent intent, int flags, int
 startId) {
     Log.d("ClearFromRecentService", "Service Started");
     return START_NOT_STICKY; }

 @Override public void onDestroy() {
     super.onDestroy();
     Log.d("ClearFromRecentService", "Service Destroyed"); }

 @Override public void onTaskRemoved(Intent rootIntent) {
     Log.e("ClearFromRecentService", "END");
     //Code here
     stopSelf(); } }

2) এই পরিষেবাটিতে নিবন্ধন করুন manifest.xml:

<service android:name="com.example.OnClearFromRecentService"
 android:stopWithTask="false" />

3) তারপরে আপনার স্প্ল্যাশ কার্যকলাপে এই পরিষেবাটি শুরু করুন

 startService(new Intent(getBaseContext(),
 OnClearFromRecentService.class));

1
এবং কেন আপনার পরিষেবা অ্যান্ড্রয়েড 8 এবং তারপরে উপরে চলতে থাকবে? আপনি বুঝতে পেরেছেন যে স্টার্টড সার্ভিসগুলি পোস্ট অ্যান্ড্রয়েড 8 এর উপর কোনও বিধিনিষেধ আছে, তাই না?
rahil008

0

বব ক্র্যাম যেমন তার উত্তরে উল্লেখ করেছেন, দেখুন মডেলের অনক্লায়ার্ড () পদ্ধতিটিই উত্তর। এটি উভয় ক্ষেত্রেই কাজ করে:

  1. যখন ব্যবহারকারী ব্যাকগ্রাউন্ড থেকে অ্যাপটি স্যুইপ করে অ্যাপটি সরিয়ে দেয়।
  2. ব্যবহারকারী ক্লিয়ার তালিকার বোতামটি ব্যবহার করে সমস্ত অ্যাপ সাফ করুন।

সার্ভিসের অন টাস্করিমোভড () ব্যবহারকারী যখন ব্যাকগ্রাউন্ড থেকে অ্যাপটি সোয়াইপ করে তখন কাজ করবে তবে কিল অল বোতামটি ব্যবহার করে অ্যাপ্লিকেশন সাফ হয়ে গেলে কাজ করবে না।

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

 override fun onCleared() {
        super.onCleared()
        Log.d(TAG , "App Killed")
    }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.