2012-05-02 17 views
24

मैं एक ऐसे ऐप पर काम कर रहा हूं जो रिमोट सर्वर पर अपने स्थान के बारे में जानकारी रिले करेगा। मैं वेब सर्वर पर एक साधारण HTTP पोस्ट करके ऐसा करने का इरादा रखता हूं और सब कुछ सरल और ठीक है।एंड्रॉइड - आवधिक पृष्ठभूमि सेवा - सलाह

लेकिन spec के अनुसार, ऐप को समय-समय पर निष्पादित करने की आवश्यकता है, हर 30 मिनट में एक बार कहें। इंटरफ़ेस से स्वतंत्र रहें, जिसका अर्थ है कि ऐप बंद होने पर भी इसे चलाने की आवश्यकता है।

मैंने चारों ओर देखा और पता चला कि एंड्रॉइड सर्विसेज का उपयोग करने की आवश्यकता है। इस तरह के एक सिस्टम को लागू करने के लिए मैं क्या उपयोग कर सकता हूं। फोन फिर से शुरू होने पर सेवा (या अन्य तंत्र) पुनरारंभ होगा?

अग्रिम धन्यवाद।

उत्तर

28

अपनी जानकारी को अपने सर्वर पर भेजने के लिए Service बनाएं। संभवतः, आपको यह नियंत्रण में मिला है।

ServiceAlarmManager द्वारा ट्रिगर किए गए अलार्म द्वारा शुरू किया जाना चाहिए, जहां आप अंतराल निर्दिष्ट कर सकते हैं। जब तक आपको अपने डेटा को हर 30 मिनट में बिल्कुल की रिपोर्ट नहीं करनी पड़े, तो आप शायद अचूक अलार्म चाहते हैं ताकि आप कुछ बैटरी जीवन बचा सकें।

अंत में, आप एक BroadcastReceiver तो तरह की स्थापना करके बूटअप प्रसारण प्राप्त करने के लिए अपने अनुप्रयोग रजिस्टर कर सकते हैं:

public class BootReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) { 
      // Register your reporting alarms here.    
     } 
    } 
} 

आप काम करने के लिए उस के लिए अपने AndroidManifest.xml के लिए निम्न अनुमति जोड़ने की आवश्यकता होगी। जब आप सामान्य रूप से ऐप चलाते हैं तो अपने अलार्म को पंजीकृत करना न भूलें, या डिवाइस बूट होने पर ही वे पंजीकृत होंगे।

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> 
0

आप निर्दिष्ट समय पर सेवा शुरू करने के लिए Alarm Manager का उपयोग कर सकते हैं और फिर निर्दिष्ट अंतराल में अलार्म दोहरा सकते हैं। जब अलार्म चालू होता है तो आप सेवा शुरू कर सकते हैं और सर्वर से कनेक्ट कर सकते हैं और

6

आप पहले सेवा की लंबित आशय बनाने अलार्म प्रबंधक के साथ आपकी सेवा अनुसूची चाहिए,:

Intent ii = new Intent(getApplicationContext(), MyService.class); 
PendingIntent pii = PendingIntent.getService(getApplicationContext(), 2222, ii, 
PendingIntent.FLAG_CANCEL_CURRENT); 

फिर अलार्म प्रबंधक का उपयोग कर यह अनुसूची:

//getting current time and add 5 seconds to it 
Calendar cal = Calendar.getInstance(); 
cal.add(Calendar.SECOND, 5); 
//registering our pending intent with alarmmanager 
AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE); 
am.set(AlarmManager.RTC_WAKEUP,cal.getTimeInMillis(), pi); 

यह आपकी सेवा का शुभारंभ करेंगे वर्तमान समय के 5 सेकंड के बाद। आप अपना अलार्म दोहरा सकते हैं।

+0

शायद आसान 'प्रणाली की तरह कुछ करने के लिए रोकने में सक्षम नहीं होना चाहिए की वजह से है आपकी शुरुआती देरी प्राप्त करने के लिए 'कैलेंडर' के साथ मिलन करने की तुलना में .currentTimeMillis() + TIMEOUT_MS'। –

+4

आप लोग जानते हैं कि आपके पास अलार्ममेनगर में 1 दिन, 12 घंटे, 1 घंटा, आधे घंटे और 15 मिनट के लिए स्थिर मूल्य हैं? 'जनता स्थिर अंतिम लंबे INTERVAL_DAY' ' जनता स्थिर अंतिम लंबे INTERVAL_FIFTEEN_MINUTES' 'जनता स्थिर अंतिम लंबे INTERVAL_HALF_DAY' ' जनता स्थिर अंतिम लंबे INTERVAL_HALF_HOUR' 'जनता स्थिर अंतिम लंबे INTERVAL_HOUR' – DaMachk

11

सेवा हमेशा के लिए चलने के लिए एक अर्द्ध-अलग तरीका है। वहाँ कोड में यह मारने के लिए यदि आप चाहें तो चाहते हैं तरीके है

पृष्ठभूमि सेवा:

package com.ex.ample; 

import android.app.Service; 
import android.content.*; 
import android.os.*; 
import android.widget.Toast; 

public class BackgroundService extends Service { 

    public Context context = this; 
    public Handler handler = null; 
    public static Runnable runnable = null; 

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

    @Override 
    public void onCreate() { 
     Toast.makeText(this, "Service created!", Toast.LENGTH_LONG).show(); 

     handler = new Handler(); 
     runnable = new Runnable() { 
      public void run() { 
       Toast.makeText(context, "Service is still running", Toast.LENGTH_LONG).show(); 
       handler.postDelayed(runnable, 10000); 
      } 
     }; 

     handler.postDelayed(runnable, 15000); 
    } 

    @Override 
    public void onDestroy() { 
     /* IF YOU WANT THIS SERVICE KILLED WITH THE APP THEN UNCOMMENT THE FOLLOWING LINE */ 
     //handler.removeCallbacks(runnable); 
     Toast.makeText(this, "Service stopped", Toast.LENGTH_LONG).show(); 
    } 

    @Override 
    public void onStart(Intent intent, int startid) { 
     Toast.makeText(this, "Service started by user.", Toast.LENGTH_LONG).show(); 
    } 
} 

यहाँ कैसे आप इसे अपने मुख्य गतिविधि से शुरू करने या जहाँ भी आप चाहते हैं:

startService(new Intent(this, BackgroundService.class)); 

onDestroy() एप्लिकेशन को बंद या मारने पर कॉल किया जाएगा लेकिन रननेबल बस इसे ठीक से शुरू कर देता है।

मुझे आशा है कि इससे किसी को मदद मिलेगी।

कारण है कि कुछ लोगों को ऐसा करने के कॉर्पोरेट अनुप्रयोगों के लिए जहां कुछ मामलों में उपयोगकर्ताओं/कर्मचारियों को कुछ बातें :)

http://i.imgur.com/1vCnYJW.png

+1

अच्छा वैकल्पिक हल है, लेकिन इस शुरू करने रखेंगे कुछ समय बाद हैंडलर, क्योंकि सेवा कुछ समय बाद फिर से शुरू हो जाएगी। पुनः आरंभ सार्वजनिक पूर्णांक onStartCommand @Override को OnCreate() से कोड के लिए कदम को रोकने के लिए – Dev

+1

(आशय आशय, झंडे int, int startId) {runnable वापसी START_NOT_STICKY के लिए // कोड; } वापसी START_NOT_STICKY यह सुनिश्चित करेगा कि सेवा पुनरारंभ नहीं होगी और आपके हैंडलर पर चलने के बाद रोक दिया जाएगा()। – Dev

+1

अपनी 'AndroidManifest.xml' में सेवा जोड़ने के लिए मत भूलना: ''। –

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