2012-04-26 15 views
5

पर पृष्ठभूमि में मैं एक VOIP आवेदन है, मैं पर डिवाइस बूटअप पृष्ठभूमि में आवेदन के लिए लॉग इन करने की जरूरत है।एंड्रॉयड: Do आवेदन लॉग इन बूटअप

वर्तमान में मेरे आवेदन में प्रवेश UI सक्रिय (onCreate()) पर किया गया है।

मैं किसी की मदद और मेरे संदेह साफ कर सकते हैं मेरे मन में निम्नलिखित बातें है,।

  1. इस कार्य को प्राप्त करने के लिए सेवा डिज़ाइन आवश्यक है ??
  2. कौन सा Service Remote(AIDL) या स्थानीय सेवा और क्यों?
  3. UI और Service बातचीत कैसे होता है?
  4. UI के बाद सक्रिय है जो कॉल-बैक प्राप्त करता है? UI या Service?
  5. क्या मुझे Service को Controller i.e Service से UI डेटा पास के विपरीत बनाना चाहिए?

नमूना अनुप्रयोग: स्काइप।

उत्तर

5

तो आप जो चाहते हैं उसे प्राप्त करने के कई तरीके हैं, यह आपकी शैली और डिजाइन को बेहतर तरीके से फिट करने का विषय है। उम्मीद है कि आपको यह जानकारी उपयोगी लगेगी।

  1. स्टार्टअप पर पृष्ठभूमि में लॉगिन करने के लिए एप्लिकेशन के लिए कुछ विकल्प हैं। पहली चीज़ जो आपको चाहिए वह ब्रॉडकास्ट रिसीवर है जिसे मैनिफेस्ट में रिसीवर के रूप में परिभाषित किया गया है। ब्रॉडकास्ट रिसीवर ACTION_BOOT_COMPLETED मंशा पकड़ो। यहां से आप अपनी सेवा लॉन्च कर सकते हैं। यह # 2 की ओर जाता है।

  2. यदि आप जो भी कर रहे हैं वह रीस्टफुल कॉल हैं तो वास्तव में एक इरादा सेवा आदर्श होगी। IntentService और Service के बीच का अंतर सरल है: एक IntentService मुख्य थ्रेड से बाहर चला जाता है, इसे 'कोड' निष्पादित करता है और मर जाता है। एक सेवा, हालांकि मुख्य धागे पर चलती है (यह एक महत्वपूर्ण तथ्य है) और लंबे समय से चल रहा है इसलिए इसे stopSelf() को बताया जाना चाहिए। मामलों को आगे बढ़ाने के लिए, एक गतिविधि की तुलना में एक सेवा भी कम होने की संभावना है (नए लॉन्च किए गए ऐप्स के लिए मेमोरी में कमरे बनाने के लिए एप्लिकेशन घटक मारे गए हैं), यानी। यह उच्च प्राथमिकता लेता है। सेवा को foreground सेवा भी घोषित की जा सकती है जिसके लिए अधिसूचना की आवश्यकता होती है लेकिन उच्च प्राथमिकता भी दी जाती है। मुझे लगता है कि आपके मामले में एक सेवा सही होगी।

  3. एक बार आपका यूआई (गतिविधि) खोला जाने के बाद सेवा से कनेक्ट करने का सबसे अच्छा तरीका Binder होगा। यदि आवश्यकता हो तो यह विभिन्न अनुप्रयोगों/घटकों से सेवा के लिए कई इंटरफेस की अनुमति देगा। एआईडीएल बहुत अच्छी चीजें है लेकिन मेरे अनुभव से प्रबंधन करना बहुत कठिन है क्योंकि सभी पैरामीटर आदिम या पैराकेबल्स होना चाहिए। एआईडीएल भी कम कुशल है क्योंकि यह वास्तव में आईपीसी का एक रूप है। जब किसी सेवा के साथ एक सेवा शुरू की जाती है तो ऑनस्टार्ट कमांड() विधि कहा जाता है। अगर सेवा को उस एप्लिकेशन से शुरू किया जाता है जो इसे बांधने की कोशिश कर रहा है तो ऑनबिंड() विधि को कॉल किया जाता है। लेकिन आप सेवा और इरादे से सेवा शुरू कर सकते हैं और उसके बाद बाध्य कर सकते हैं। यदि आप रीस्टफुल दृष्टिकोण को पसंद करते हैं जहां आपके पास डेटा के लिए त्वरित कॉल है तो आप ResultReceiver के साथ एक इंटेंट सेवा का उपयोग कर सकते हैं। This is a great article Google I/O उदाहरणों के बारे में लिखा गया है और यदि आप IntentService और ResultReceiver में रुचि रखते हैं तो केवल समग्र रूप से लागू किया गया है।

  4. यह आपके ऊपर है। बाइंडर या एआईडीएल का उपयोग करके आपकी गतिविधि सेवा विधियों को ऑब्जेक्ट विधि की तरह कॉल कर सकती है जहां 'कॉलबैक' विधि विधि ही होगी। यदि आप परिणाम रिसीवर का उपयोग करते हैं तो रिसीवर इंटरफ़ेस करने वाली गतिविधि कॉलबैक होगी। आप इरादे को आगे और आगे भी पारित कर सकते हैं लेकिन यह गन्दा हो सकता है। फिर आपके मामले के लिए बाइंडर दृष्टिकोण अच्छा और रिसीवर भी अच्छा होगा।

  5. एमवीवीएम सिस्टम में एक मॉडल के रूप में सेवा के बारे में सोचें - इसे डेटा प्राप्त करने के लिए एक सहायक के रूप में उपयोग करें, न कि एप्लिकेशन के तर्क को नियंत्रित करने वाले कुछ के रूप में।

क्षमा करें अगर यह गन्दा लगता है कि आप जो खोज रहे हैं उसे हासिल करने के कई तरीके हैं। यह सिर्फ एक मामला है जो आपकी स्थिति को फिट करता है जो आप महसूस करते हैं वह बेहतर है। एंड्रॉइड एसडीके का उल्लेख नहीं करना काफी बड़ा है। मैंने उन सभी विषयों पर हिट करने की कोशिश की जो आपकी मदद कर सकते हैं। सौभाग्य!

+0

उत्तर मेरे प्रश्न के लिए प्रासंगिक है, इसलिए इसे उत्तर के रूप में चिह्नित करें .. धन्यवाद jjNford – NitZRobotKoder

+1

@NitZRobotKoder कोई समस्या नहीं, सभी सेवाएं और उपयोग कैसे किया जा सकता है मुश्किल हो सकता है। यह जानने में मदद करता है कि आगे कहां देखना है। सौभाग्य! – jjNford

0

आप पृष्ठभूमि सेवाओं पैकेज com.javaorigin.android.sample.service द्वारा उपयोगकर्ता लॉगिन authanticate कर सकते हैं;

import android.app.Service; 
import android.content.Intent; 
import android.os.IBinder; 
import android.util.Log; 
import android.widget.Toast; 

public class MyService extends Service { 

    String tag="TestService"; 
    @Override 
    public void onCreate() { 
     super.onCreate(); 
     Toast.makeText(this, "Service created...", Toast.LENGTH_LONG).show();  
     Log.i(tag, "Service created..."); 
    } 

    @Override 
    public void onStart(Intent intent, int startId) {  
     super.onStart(intent, startId); 
     Log.i(tag, "Service started..."); 
    } 
    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     Toast.makeText(this, "Service destroyed...", Toast.LENGTH_LONG).show(); 
    } 

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


public class SampleAction extends Activity { 
    @Override 
    protected void onCreate(Bundle savedInstanceState) {  
     super.onCreate(savedInstanceState); 
     TextView view = new TextView(this);  
     view.setText("Service Test"); 
     Intent i = new Intent(); 
     i.setClassName("com.javaorigin.android.sample.service", 
     "com.javaorigin.android.sample.service.MyService"); 
     bindService(i, null, Context.BIND_AUTO_CREATE); 
     this.startService(i);  
     setContentView(view); 
    } 
} 
+0

दीपक, आप आर शुरू कर रहे हैं और फिर सेवा शुरू कर रहे हैं .. मेरे ऐप को यूआई के बिना लॉगिन करना चाहिए .. – NitZRobotKoder

+0

फिर उपयोगकर्ता से लॉगिन क्रेडिट कैसे प्राप्त होते हैं? –

+0

एक ऐसे मामले की कल्पना करें जहां उपयोगकर्ता इसे पहले से सेट कर चुका है, और सेटिंग्स जैसे ही ईश्वरीय समय नहीं पूछती है .. – NitZRobotKoder

1

बूट रिसीवर के साथ एक सेवा का प्रयास करें। Here is an example मुझे एक त्वरित Google खोज के बाद मिला। फिर ऐप शुरू होने पर कहीं भी लॉगिन जानकारी में स्टोर करना सुनिश्चित करें। सुनिश्चित नहीं है कि आपके पास क्या कॉलबैक हो सकता है, इसलिए उस भाग का जवाब देना वाकई मुश्किल है। मैं कहूंगा कि अगर कॉलबैक को यूआई को प्रभावित करना चाहिए तो गतिविधि शुरू होने पर गतिविधि को खत्म कर दें। अगर आपको केवल यूआई की आवश्यकता होती है, तो केवल एक सूचना को फेंकने के लिए सबसे अच्छा है और कॉलबैक डेटा के साथ उचित गतिविधि को कॉल करना सबसे अच्छा है।

+0

@Mikelsrael आपके इनपुट के लिए धन्यवाद .. कॉलबैक लॉग इन सफलता/विफलता या नेटवर्क यूपी/डाउन इत्यादि के बारे में होगा। लेकिन मुझे आपकी टिप्पणी का यह संदर्भ नहीं मिला .. "अगर आपको केवल यूआई की आवश्यकता है सेवा चल रही है, शायद अधिसूचना फेंकने के लिए सबसे अच्छा है और इसे कॉलबैक डेटा के साथ उचित गतिविधि कहते हैं। " – NitZRobotKoder

+1

@NitZRobotKoder मैं अधिसूचना बार के माध्यम से उपयोगकर्ता को सूचित करने के साथ सौदा करने का एक अच्छा तरीका कह रहा था। तो बस एक सेवा करें जो लॉगिन करने का प्रयास करती है और नेटवर्क परिवर्तनों के लिए प्रसारण रिसीवर के रूप में पंजीकृत है। फिर जब सेवा किसी ऐसी घटना पर आती है जिसे उपयोगकर्ता को सूचित करने की आवश्यकता होती है तो वह सूचना अधिसूचना को अधिसूचना करता है। अधिसूचनाओं के बारे में अधिक जानकारी के लिए यह लिंक देखें http://developer.android.com/guide/topics/ui/notifiers/notifications.html – MikeIsrael

+0

@Mikelsrael हाँ ठीक है .. लेकिन नियंत्रक के रूप में कौन कार्य करेगा .. – NitZRobotKoder

0

आप लॉगिन है इतने लंबे समय के उपयोग [AccountManager][1] लेता है और यह केवल एक बार करते हैं। AccountManager के पीछे एक टोकन या आपके Service में उपयोग करने के लिए आवश्यक प्रमाण-पत्रों के पीछे विचार।

अपने विशेष मामले में मुझे लगता है कि संवाद स्थापित करने का सबसे अच्छा तरीका अपने ActivityService के साथ के लिए बाध्य कर रहा है।

0

बुनियादी Service उपयोग के बारे में ज्ञान का सर्वोत्तम स्रोत SDK है। लंबी कहानी लघु AIDL आईपीसी संचार के लिए उपयोग की जाती है और जब तक आप उसी प्रक्रिया में सेवा चलाते हैं तो आपको इसकी आवश्यकता नहीं होती है।

  1. केवल एक चीज आप बस के लिए लॉग इन कर रहा है की जरूरत है, तो आप बूट अप, लॉगिन पर एक सेवा शुरू कर सकते हैं और उसके बाद यानी बंडल प्रवेश डेटा जो तब प्राप्त हो जाएगा के साथ एक स्टिकी प्रसारण भेजें तो: मैं आपके पास दो विकल्प लगता है आवेदन में। बूट अप पर सेवा शुरू करने के तरीकों के एक अच्छे सेट के लिए this question देखें।

    @Override 
    public void onCreate() { 
        Data data = performLogin(); 
        Intent i = new Intent(ACTION_VOIP_LOGIN); 
        i.putExtra(EXTRA_LOGIN_DATA, data); 
        mContext.sendStickyBroadcast(i); 
    } 
    
    ... 
    
    private final class LoginReceiver extends BroadcastReceiver { 
        @Override 
        public void onReceive(Context context, Intent intent) { 
         // You may use a Bundle instead 
         Data data = intent.getParcelableExtra(); 
         processLoginData(data) 
        } 
    } 
    
    protected void onCreate(Bundle savedInstanceState) { 
        ... 
        IntentFilter filter = new IntentFilter(ACTION_VOIP_LOGIN); 
        mContext.registerReceiver(new LoginReceiver(), filter); 
    } 
    
  2. दूसरे मामले में आप अपने सभी तर्क सेवा में ले जाना चाहते हैं। यहां आप Binder कक्षा का विस्तार करेंगे। विवरण के लिए यह SDK article देखें।