2011-08-09 9 views
6

प्राप्त मैं एक एंड्रॉयड डिवाइस पर एक अधिसूचना प्रदर्शित करने के लिए this ट्यूटोरियल पीछा कर रहा था पर एक दृश्य प्रदर्शित करें। जब मैंने डिवाइस पर एप्लिकेशन चलाया, तो स्टेटस बार पर एक आइकन दिखाई दिया (आमतौर पर यह एंड्रॉइड डिवाइस पर दिखाई देता है) जो बिल्कुल सही है। लेकिन जिज्ञासा से बाहर मैं जानना चाहता था कि जब डिवाइस को अधिसूचना प्राप्त होती है तो क्या मैं कुछ विवरणों के साथ अलर्ट या कुछ दृश्य प्रदर्शित कर सकता हूं? मैं इस अवधारणा को अपने अगले आवेदन में लागू करना चाहता हूं।
कुछ नमूना मेरी मदद करेंगे।एक चेतावनी या एक अधिसूचना

+1

मैंने एक कामकाज किया है .. इस छवि को जांचें: http://img854.imageshack.us/img854/1522/previewglobaldialog.png –

उत्तर

0

आपके आवेदन के एक निश्चित हिस्से को "प्राप्त करने" या विशिष्ट उद्देश्यों के लिए सुनने के लिए एक सामान्य प्रकार का पैटर्न होगा। इस तरह, आपका आवेदन समय पर किसी भी मनमानी बिंदु पर जाग सकता है, कॉलिंग मंशा को देख सकता है, और यह तय कर सकता है कि इसे कैसे संभालना है (चाहे वह पूर्ण एप्लिकेशन शुरू हो, एक संवाद प्रदर्शित कर रहा हो, या कुछ और)। एक अच्छी बात यह है कि इसके साथ-साथ अलार्म मैनेजर का उपयोग अलार्म सेट करने के लिए किया जाता है जो भविष्य में आपके आवेदन को आग और जागृत करेगा (आवधिक अपडेट)।

क्या यह आपके प्रश्न का उत्तर देता है? मैंने अपने आवेदन में ऐसा कुछ किया है और यदि आप चाहें तो मैं कोड के साथ आपकी मदद कर सकता हूं।

संपादित इस लागू करने के लिए आप एक जावा वर्ग है कि या तो BroadcastReceiver या IntentService (यदि आप वर्ग में क्रमश: ui धागे पर या एक सेवा के रूप चलाना चाहते हैं पर निर्भर करता है) का विस्तार होगा। नीचे मेरी उदाहरण में, मैं अपने खुद के इरादे कार्रवाई कुंजी परिभाषित किया है, लेकिन आम तौर पर आप intent.getAction() के साथ कार्रवाई की जाँच करेगा:

public class QueryService extends IntentService { 
public final static String SERVICE_NAME = "QueryService"; 

// incoming flags 
public final static String FLAG_ACTION = "R_ACTION"; 
public final static String FLAG_EVENTS_RETURNED = "R_EVENTS"; 
public final static String FLAG_EVENTS_ARCHIVED_RETURNED = "R_EVENTS_ARCH"; 
public final static String FLAG_SHARED_PREFERNCES_RETURNED = "R_PREFS"; 

// outgoing flags 
public final static String RETURN_EVENTS = "RETURN_E"; 
public final static String RETURN_EVENTS_ARCHIVED = "RETURN_E_A"; 
public final static String RETURN_SHARED_PREFS = "RETURN_S_P"; 

public QueryService() { 
    super(SERVICE_NAME); 
} 

protected void onHandleIntent(Intent intent) { 
    String rAction = intent.getStringExtra(FLAG_ACTION); 
    boolean rEvents = intent.getBooleanExtra(FLAG_EVENTS_RETURNED, true); 
    boolean rEventsArchived = intent.getBooleanExtra(FLAG_EVENTS_ARCHIVED_RETURNED, true); 
    boolean rSharedPrefs = intent.getBooleanExtra(FLAG_SHARED_PREFERNCES_RETURNED, true); 

    if(rAction == null){ 
     Log.e(SERVICE_NAME, "no return action specified, exiting..."); 
     return; 
    } 

    Log.i(SERVICE_NAME, "Caller: " + rAction); 

    DroidTaskApplication app = (DroidTaskApplication)getApplicationContext(); 

    Intent resultsIntent = new Intent(rAction); 
    // TODO assembling events/archived events from a database needs 
    // a function that gets the complete event instead of just its headers 

    // assemble event objects and insert them 
    if(rEvents){ 
     List<Event> liteEvents = app.edo.getAllEvents(); 
     if(liteEvents != null){ 
      for(Event e : liteEvents){ 
       int id = e.getId(); 
       e.setAlarms(app.edo.getAlarmsById(id)); 
       e.setSubtasks(app.edo.getSubtasksById(id)); 
       e.setNotes(app.edo.getNotesById(id)); 
      } 
     } 
     resultsIntent.putExtra(RETURN_EVENTS, (Serializable)liteEvents); 
    } 
    // assemble archived event objects and insert 
    if(rEventsArchived){ 
     List<Event> liteEventsA = app.edo.getAllArchivedEvents(); 
     resultsIntent.putExtra(RETURN_EVENTS_ARCHIVED, (Serializable)liteEventsA); 
    } 
    // collect the shared data and send it 
    if(rSharedPrefs){ 
     SharedPreferences prefs = getSharedPreferences(getString(R.string.PREFS_FILE_NAME), MODE_WORLD_READABLE); 
     resultsIntent.putExtra(RETURN_SHARED_PREFS, (Serializable)(prefs == null? null : prefs.getAll())); 
    }   

    Log.i(SERVICE_NAME, "returning results"); 

    // send everything to the caller 
    sendBroadcast(resultsIntent); 
} 

} 

बावजूद वर्ग एक सेवा या प्रसारण रिसीवर है है, आप रजिस्टर करना होगा एप्लिकेशन को "रिसीवर" के रूप में (जिसका अर्थ है कि यह किसी प्रकार का इरादा प्रसारण स्वीकार कर सकता है); यह जावा कोड या एंड्रॉइड मेनिफेस्ट में किया जा सकता है। एक उदाहरण मैं प्रकट में है कि सेवा के लिए उपयोग से कम है (यद्यपि मेरी जावा वर्ग, परवाह नहीं है आशय कार्रवाई के बारे में अभी तक):

<!-- Notification Launcher --> 
    <receiver android:name="edu.clarkson.dtask.BK.NotificationReceiver" android:enabled="true"> 
     <intent-filter> 
      <action android:name="edu.clarkson.dtask.BK.NotificationReceiver.DISPATCH_ALARM" /> 
      <action android:name="edu.clarkson.dtask.BK.NotificationReceiver.CANCEL_ALARM" /> 
     </intent-filter> 
    </receiver> 

अलग प्रणाली कार्यों और सूचनाएं ओएस जब से प्रसारित किया जाएगा एक निश्चित राज्य परिवर्तन; यदि आप इन परिवर्तनों के बारे में सुनना चाहते हैं, तो आप एक अलग इरादा कार्रवाई (जैसे ACTION_BATTERY_STATE_CHANGED) के लिए मैनिफेस्ट में उपरोक्त के रूप में एक प्रसारणकर्ता या intentservice पंजीकृत करते हैं। सभी दस्तावेज android dev site पर पाए जा सकते हैं। मुझे आशा है कि आप सही रास्ते पर शुरू करेंगे।

+0

हाँ कृपया। यह वास्तव में सहायक होगा। –

+0

मैंने शुरू करने के लिए कुछ उदाहरण कोड और उपयोग शामिल करने के लिए अपना उत्तर संपादित किया है। – Blaskovicz

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