2011-08-13 8 views
7

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

किसी दिए गए समय में गतिविधि शुरू करने के लिए आप अलार्ममेनर (एंड्रॉइड एपीआई में) का उपयोग कैसे करते हैं? इस समस्या का कोई समाधान होगा।

इसे प्राप्त करने का मेरा नवीनतम प्रयास नीचे है।

(आयात छोड़े गए। मैं के बाद कार्यक्रम खोला है, जो यह नहीं। कोई त्रुटि संदेशों में से बात करने के लिए कर रहे हैं करता MyActivity 3 सेकंड शुरू करने के लिए उम्मीद है।)

public class AndroidTest2Activity extends Activity { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     Context context = this;//.getApplicationContext(); 

     AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); // CORRECT 
     Intent intent = new Intent(context, myReceiver.class); // CORRECT 
     PendingIntent pending = PendingIntent.getBroadcast(context, 0, intent, 0); // CORRECT 
     manager.set(AlarmManager.RTC, System.currentTimeMillis() + 3000, pending); // CORRECT 

     setContentView(R.layout.main); 
    } 
} 

public class myReceiver extends BroadcastReceiver { 
    public void onReceive(Context context, Intent intent) { 
     Intent i=new Intent(context, myActivity.class); 
     i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     context.startActivity(i); 
    } 
} 

public class myActivity extends Activity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     Log.d("", "Elusive success"); 
     setContentView(R.layout.main); 
    } 
} 

किसी भी सलाह की सराहना की जाएगी।

कृपया ध्यान दें: मैं प्रकट में myReceiver मिल गया है पहले से ही

+2

क्या आपने अपने AndroidManifest में रिसीवर पंजीकृत किया था? –

+0

क्षमा करें, इसका उल्लेख किया जाना चाहिए था। लाइन <रिसीवर एंड्रॉइड: नाम = "। MyReceiver"> के साथ, हाँ मैंने किया। अगर मुझे गलत रेखा है तो मुझे बताएं। – BenLambell

उत्तर

0

जावा सम्मेलन वर्ग के नाम के अनुसार राजधानी letter.So के साथ शुरू बदलने के अपने

"myReceiver" to "MyReceiver" and "myActivity" to "MyActivity". 

तब की तरह मैनिफ़ेस्ट फ़ाइल में अपने रिसीवर को जोड़ने नीचे।

<application 
------------ 
<receiver android:name="MyReceiver"></receiver> 
--------------------- 
</application> 
+0

मैंने उचित जावा सम्मेलन अपनाया है, बस मामले में। हालांकि मैनिफेस्ट में पहले से ही सही रेखा थी (मैंने एंड्रॉइड के रूप में माइक्रिसिवर और माइक्रिसिवर का उपयोग करने का प्रयास किया है: नाम - स्रोत जो मैंने देखा है या तो ऐसा लगता है)। किसी भी मामले में, यह समस्या को ठीक नहीं करता है, लेकिन आपके सुझाव के लिए धन्यवाद। – BenLambell

4

आप AlarmManager (एंड्रॉयड एपीआई में) का उपयोग कैसे करूँ एक निश्चित समय पर एक गतिविधि शुरू करने के लिए?

को set() पर कॉल करें जो कॉल करने के लिए गतिविधि की पहचान करता है। या, आप जो कर रहे हैं वह करें, जो ठीक काम करना चाहिए।

This sample project, थोड़ा विस्तृत है, क्योंकि यह गहरी अपनी पुस्तकों में से एक में 19 ट्यूटोरियल है, लेकिन अगर आप EditPreferences, OnBootReceiver, और OnAlarmReceiver तरह वर्गों को देखो, आप एक ही मूल नुस्खा है कि आप इसके बाद के संस्करण का उपयोग कर रहे देखेंगे। इस मामले में, मैं सिर्फ getActivity()PendingIntent का उपयोग कर सकता था, लेकिन इसके बाद ट्यूटोरियल उपयोगकर्ता को गतिविधि लॉन्च करने या Notification प्रदर्शित करने का विकल्प देता है, इसलिए BroadcastReceiver अधिक समझ में आता है।

लॉगकैट में त्रुटियों के अलावा चेतावनियों की तलाश करें। सबसे अधिक संभावना है कि आपका रिसीवर या गतिविधि आपके प्रकट में नहीं है।

ध्यान दें कि कहीं भी के बीच की गतिविधि को पॉप अप करना आम तौर पर एक अच्छा विचार नहीं है। निश्चित रूप से काम करता है

एक पूर्ण स्क्रीन गतिविधि के माध्यम से खाने अलार्म प्रदर्शित, और यदि उपयोगकर्ता स्क्रीन पर देख रहा है, यह उनका ध्यान मिल जाएगा: विचाराधीन पुस्तक से अपने आप का हवाला देते हुए। हालांकि, यह भी विघटनकारी है अगर वे फ़ोन का उपयोग कर रहे हैं तो तत्काल। उदाहरण के लिए, यदि वे ड्राइविंग करते समय एक टेक्स्ट संदेश टाइप कर रहे हैं, तो आपकी कहीं भी बाहर निकलने वाली अलार्म गतिविधि उन्हें तक दुर्घटना का कारण बन सकती है। इसलिए, सार्वजनिक सुरक्षा के हित में, हमें उपयोगकर्ता को पर एक विकल्प देना चाहिए ताकि उन्हें दोपहर का भोजन करने के लिए याद दिलाने के लिए एक और अधिक सूक्ष्म तरीका हो।

+0

त्वरित प्रतिक्रिया के लिए धन्यवाद - मैंने वास्तव में पहले से ही आपका ट्यूटोरियल देखा है। मैंने इरादा इरादा = नया इरादा (संदर्भ, MyActivity.class) को प्रतिस्थापित करने का प्रयास किया; // कॉररेक्ट लंबित इन्टेंट लंबित = लंबित INTent.getActivity (संदर्भ, 0, मंशा, 0); // कॉररेक्ट – BenLambell

+1

क्षमा करें, मैं पुनः प्रयास करूंगा: – BenLambell

+0

त्वरित प्रतिक्रिया के लिए धन्यवाद - मैंने वास्तव में पहले से ही आपका ट्यूटोरियल देखा है (और रिसीवर को मैनिफेस्ट में डाल दिया है)। मैंने \t इरादा इरादा = नया इरादा (संदर्भ, MyActivity.class) में प्रतिस्थापन करने का प्रयास किया; लंबित इन्टेंट लंबित = लंबित INTent.getActivity (संदर्भ, 0, मंशा, 0); \t लेकिन अभी भी MyActivity चलने का कोई सबूत नहीं मिलता है।हालांकि, मुझे निम्न लॉग संदेश प्राप्त होता है: \t (गतिविधि प्रबंधक) प्रारंभ: इरादा {flg = 0x4 cmp = com.ben/.MyActivity (अतिरिक्त है)} pid -1 – BenLambell

5

अगर कोई और इस पर ठोकर खाता है - यहां कुछ कामकाजी कोड है (2.3 पर परीक्षण किया गया।3 एमुलेटर):

public final void setAlarm(int seconds) { 
    // create the pending intent 
    Intent intent = new Intent(MainActivity.this, AlarmReceiver.class); 
    // intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    pendingIntent = PendingIntent.getBroadcast(MainActivity.this, 0, 
      intent, 0); 
    // get the alarm manager, and scedule an alarm that calls the receiver 
    ((AlarmManager) getSystemService(ALARM_SERVICE)).set(
      AlarmManager.RTC, System.currentTimeMillis() + seconds 
        * 1000, pendingIntent); 
    Toast.makeText(MainActivity.this, "Timer set to " + seconds + " seconds.", 
      Toast.LENGTH_SHORT).show(); 
} 

public static class AlarmReceiver extends BroadcastReceiver { 
    public void onReceive(Context context, Intent intent) { 
     Log.d("-", "Receiver3"); 
    } 
} 

AndroidManifest.xml:

<receiver android:name="com.example.test.MainActivity$AlarmReceiver" > 
    </receiver> 

BenLambell के कोड के साथ मुद्दे:

  • या तो:
    • चाल अपने आप जावा फाइल करने के लिए रिसीवर या
    • आंतरिक सीएल बनाओ स्थिर गधा - तो यह से बाहर
  • रिसीवर प्रकट में सही ढंग से घोषित नहीं किया गया है पहुँचा जा सकता है:
    • अगर यह MainActivity उपयोग में एक आंतरिक वर्ग है: <receiver android:name="package.name.MainActivity$AlarmReceiver" ></receiver>
    • अगर यह एक अलग फाइल में है : <receiver android:name="package.name.AlarmReceiver" ></receiver>

अपने इरादे में एक संवाद प्रदर्शित करने के लिए है, तो रिसीवर की ऑनसीसिव (मेरे जैसे): इसकी अनुमति नहीं है - केवल गतिविधियां संवाद शुरू कर सकती हैं। यह dialog activity के साथ हासिल किया जा सकता है।

आप सीधे AlarmManager साथ एक गतिविधि कॉल कर सकते हैं:

Intent intent = new Intent(MainActivity.this, TriggeredActivity.class); 
PendingIntent pendingIntent = PendingIntent.getActivity(MainActivity.this, 0, intent, PendingIntent.FLAG_ONE_SHOT); 
((AlarmManager) getSystemService(ALARM_SERVICE)).set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + seconds * 1000, pendingIntent); 
1

अपने Android mainifest फ़ाइल में इस जोड़ सकते हैं और यह उम्मीद है कि काम करेंगे

<activity android:name=".MyReceiver" /> 
     <receiver android:name=".MyReceiver"> </receiver> 
0

आप के लिए रिसीवर के लिए किसी भी प्रसारण नहीं भेज रहे हैं रिसीवर और इसके अलावा आप इसे एक स्प्लैश स्क्रीन चाहते हैं या उस उद्देश्य के लिए कुछ ऐसा चाहते हैं, आप कुछ सेकेंड के लिए एक नया थ्रेड इंतजार शुरू कर सकते हैं और उसमें अपनी गतिविधि शुरू कर सकते हैं और उस अवधि के लिए आप जो भी यूआई पर चाहते हैं धागा ...

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