7

मेरा एंड्रॉइड 4+ ऐप एक कस्टम वेब सेवा से जुड़ा हुआ है जिसका उपयोग हर कुछ मिनट में डेटा सिंक करने के लिए किया जाता है। यह सुनिश्चित करने के लिए कि ऑनलाइन डेटा हमेशा अद्यतित रहता है, जब भी ऐप बंद हो जाता है/पृष्ठभूमि में भेजता है, तो मैं सिंक को ट्रिगर करना चाहता हूं।एंड्रॉइड ऐप बंद/पृष्ठभूमि पर सेट होने पर पृष्ठभूमि कार्य निष्पादित करने के लिए कैसे करें?

तहत आईओएस यह काफी आसान है:

  • आप लंबी चलने वाली पृष्ठभूमि कार्य शुरू करने के लिए AppDelegate
  • उपयोग beginBackgroundTaskWithName: में applicationDidEnterBackground: को सुनें और निलंबित किया जा रहा से बचने के लिए, जबकि कार्य अभी भी
चल रहा है

एंड्रॉइड पर यह कैसे करें?

पहली समस्या है, कि applicationDidEnterBackground: के बराबर कुछ भी नहीं है। अब तक मिले सभी समाधान मुख्य गतिविधियां onPause() विधि का उपयोग करने का प्रस्ताव देते हैं। हालांकि इसे किसी भी समय मुख्य Activity रोका गया है, जो तब भी होता है जब ऐप के भीतर कोई अन्य Activity प्रारंभ होता है। ActivityLifecycleCallbacks इंटरफेस से onActivityPaused() विधि के लिए यह सच है।

तो, यह पता लगाने के लिए कि ऐप (केवल Activity नहीं) बंद है या पृष्ठभूमि को भेज दिया गया है?

दूसरी समस्या है, मुझे पृष्ठभूमि कार्य को चलाने के तरीके के बारे में कोई जानकारी नहीं मिली है। सभी समाधान बस AsyncTask शुरू करने के लिए इंगित करते हैं, लेकिन क्या यह वास्तव में सही समाधान है?

AsyncTask एक नया कार्य शुरू करेगा, लेकिन यह कार्य भी बंद हो जाएगा, जब ऐप बंद/निष्क्रिय हो? ऐप और कार्य को कुछ सेकंड के बाद निलंबित होने से रोकने के लिए मुझे क्या करना है? ऐप पूरी तरह से निलंबित होने से पहले, मैं कैसे सुनिश्चित कर सकता हूं कि कार्य पूरा हो सकता है?

import android.app.Service; 
import android.content.Intent; 
import android.os.Binder; 
import android.os.Handler; 
import android.os.IBinder; 
import android.widget.Toast; 

public class SendDataService extends Service { 
    private final LocalBinder mBinder = new LocalBinder(); 
    protected Handler handler; 
    protected Toast mToast; 

    public class LocalBinder extends Binder { 
     public SendDataService getService() { 
      return SendDataService .this; 
     } 
    } 

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

    @Override 
    public void onCreate() { 
     super.onCreate(); 

    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     handler = new Handler(); 
     handler.post(new Runnable() { 
      @Override 
      public void run() { 

// write your code to post content on server 
      } 
     }); 
     return android.app.Service.START_STICKY; 
    } 

} 

मेरे कोड का अधिक विवरण है:

+0

आप –

+0

के लिए सेवाओं का उपयोग कर सकते हैं क्या आपने एक सेवा माना है? – apmartin1991

+0

सेवा का उपयोग करें https://developer.android.com/reference/android/app/Service.html –

उत्तर

8

के बाद कोड होगा कि आपका ऐप्लिकेशन को बंद कर दिया या पृष्ठभूमि में है आप अपनी सामग्री पोस्ट करने के लिए मदद मिलेगी

सेवा पृष्ठभूमि भले ही अपने आवेदन में है में चलाता है पृष्ठभूमि लेकिन याद रखें कि यह हमेशा मुख्य धागे पर चलता है जिसके कारण मैंने आपके पृष्ठभूमि संचालन करने के लिए एक अलग धागा बनाया है .:

सेवा चिपचिपा एक के रूप में शुरू की गई है, भले ही आपकी सेवा बैकग्राउन में नष्ट हो गई हो डी स्वचालित रूप से पुनरारंभ हो जाएगा।

अधिक जानकारी यहां पाया जा सकता है: https://developer.android.com/guide/components/services.html

और जांच करने के लिए कि आपके ऐप में निम्न कोड में मदद मिलेगी अग्रभूमि/पृष्ठभूमि में है:

private boolean isAppOnForeground(Context context) { 
    ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); 
    List<RunningAppProcessInfo> appProcesses = activityManager.getRunningAppProcesses(); 
    if (appProcesses == null) { 
     return false; 
    } 
    final String packageName = context.getPackageName(); 
    for (RunningAppProcessInfo appProcess : appProcesses) { 
     if (appProcess.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND && appProcess.processName.equals(packageName)) { 
     return true; 
     } 
    } 
    return false; 
    } 
} 

// Use like this: 
boolean foregroud = new ForegroundCheckTask().execute(context).get(); 

कोडिंग मुबारक !!!!

+0

डाउनवॉटेड क्योंकि सिर्फ स्पष्टीकरण के बिना कोड दिखा रहा है, और मूल पोस्टर को स्वचालित रूप से समझने की उम्मीद है, यह हमेशा ऐसा नहीं होता है। यदि आप अपना उत्तर सुधारते हैं तो मेरा डाउनवोट हटा देगा। – Diti

+0

@Diti खुश कोडिंग !!! : डी – Anjali

+0

हो गया! शुरुआती लोगों को जवाब अधिक समझने के लिए अपना समय लेने के लिए धन्यवाद! – Diti

3

आप जो हासिल करना चाहते हैं उसके लिए आप सेवाओं का उपयोग कर सकते हैं।एक सेवा पृष्ठभूमि में चलती रहती है, भले ही गतिविधि घटक नष्ट हो गया हो, बशर्ते आपने StopService (..) या stopSelf() विधियों को नहीं बुलाया है।

सेवा में आप एसिंक नेटवर्क कॉल कर सकते हैं, अधिमानतः रेट्रोफिट का उपयोग कर सकते हैं, और फिर आप अपनी वेब सेवा से प्राप्त नवीनतम डेटा के साथ एसक्लाइट डीबी जैसे स्थानीय स्टोरेज को अपडेट कर सकते हैं।

Here आधिकारिक लिंक है, आप केवल जो हासिल करना चाहते हैं उसके लिए एक असंबद्ध सेवा का उपयोग कर सकते हैं।

+0

उपलब्ध हैं बहुत बहुत धन्यवाद। एक 'सेवा' वास्तव में समस्या एनआर के लिए एक आदर्श समाधान प्रतीत होता है। 2. पहली समस्या के बारे में क्या: सही ढंग से पता लगाने के लिए कि ऐप को रोक दिया गया था/बंद किया गया था, न केवल एक गतिविधि? –

+0

इसके लिए आप गतिविधि जीवन चक्र विधियों जैसे onPause() और onDestroy() को ओवरराइड कर सकते हैं। यदि आपकी गतिविधि बैक स्टैक में आखिरी वस्तु है और आप एंड्रॉइड डिफॉल्ट बैक बटन दबाते हैं, तो ऑनडिस्ट्रॉय() को कॉल किया जाता है, और आप अपने ऐप से बाहर निकलते हैं। –

संबंधित मुद्दे