2011-01-11 26 views
9

मैं घंटों के लिए इसके साथ संघर्ष कर रहा हूं। मैंने दस्तावेज और कई विषयों की भी जांच की है। मुझे यह कोड दो विषयों में मिला, दोनों लोगों ने कहा कि कोड पूरी तरह से काम कर रहा था, लेकिन मेरे कंप्यूटर पर नहीं। पहला टोस्ट प्रकट होता है, लेकिन दूसरा कभी नहीं। गलत क्या है?एंड्रॉइड अलार्म काम नहीं कर रहा है

public class HelloAndroid2 extends Activity { 


@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    Intent intent = new Intent(this, AlarmReceiver.class); 

    PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, 
    intent, PendingIntent.FLAG_ONE_SHOT); 

    AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); 
    alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + (10 * 1000), pendingIntent); 
    Toast.makeText(this, "Alarm set", Toast.LENGTH_LONG).show(); 

} 

public final class AlarmReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     Toast.makeText(context, "Alarm worked.", Toast.LENGTH_LONG).show(); 

    } 
} 

}

+0

कृपया अपना AndroidManifest.xml दिखाएं। आपको अपने प्रसारण रिसीवर को मैनिफेस्ट में घोषित करना चाहिए और – ccheneson

उत्तर

33

वास्तव में आप जब से तुम इरादे में वर्ग AlarmReceiver.class का उपयोग कार्रवाई निर्दिष्ट करने की आवश्यकता नहीं है।

<receiver android:name="AlarmReceiver">

संपादित करें:: ठीक है वहाँ अपने प्रसारण रिसीवर का उपयोग करने के लिए 2 तरीके हैं

अपने AndroidManifest.xml में, आप <application> टैग के भीतर एक रिसीवर परिभाषा की तरह कुछ है सुनिश्चित करें।

1) कोड से आपके द्वारा दी गई, AlarmReceiver.java कि होगा शामिल हैं:

public final class AlarmReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     Toast.makeText(context, "Alarm worked.", Toast.LENGTH_LONG).show(); 

    } 
} 

और HelloAndroid2.java:

public class HelloAndroid2 extends Activity { 


@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    Intent intent = new Intent(this, AlarmReceiver.class); 

    PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, 
    intent, PendingIntent.FLAG_ONE_SHOT); 

    AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); 
    alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + (10 * 1000), pendingIntent); 
    Toast.makeText(this, "Alarm set", Toast.LENGTH_LONG).show(); 

} 

} 

इस तरह, आप AndroidManifest.xml और के साथ काम करने के लिए अपने प्रसारण रिसीवर सेट कर सकते हैं टैग <receiver ...>

2) दूसरा तरीका। इस तरह, आप केवल 1 फ़ाइल HelloWorld2.java:

अपनी गतिविधि में, अपना प्रसारण रिसीवर बनाएं और इसे पंजीकृत करें।

public class HelloWorld2 extends Activity { 
    private SharedPreferences prefs; 
    private String mName; 


    BroadcastReceiver alarmReceiver = new BroadcastReceiver() { 

     @Override 
     public void onReceive(Context context, Intent intent) { 
      Toast.makeText(context, "Alarm worked", Toast.LENGTH_LONG).show();   
     } 
    }; 


    public static final String ACTION_NAME = "com.helloworld.MYACTION"; 
    private IntentFilter myFilter = new IntentFilter(ACTION_NAME); 


    @Override 
    protected void onPause() { 
     unregisterReceiver(alarmReceiver); 
     super.onPause(); 
    } 

    @Override 
    protected void onResume() { 
     registerReceiver(alarmReceiver, myFilter); 
     super.onResume(); 
    } 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 

     registerReceiver(alarmReceiver, myFilter); 

     Intent intent = new Intent(ACTION_NAME);   

     PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, 
     intent, PendingIntent.FLAG_ONE_SHOT); 

     AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); 
     alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + (10 * 1000), pendingIntent); 
     Toast.makeText(this, "Alarm set", Toast.LENGTH_LONG).show(); 


    } 
+0

पर प्रतिक्रिया होगी, उत्तर के लिए धन्यवाद, लेकिन अभी भी कुछ भी नहीं। : यह .xml फ़ाइल है <आवेदन एंड्रॉयड: आइकन = "@ drawable/आइकन" एंड्रॉयड: लेबल = "@ स्ट्रिंग/app_name"> \t <रिसीवर एंड्रॉयड: नाम = "AlarmReceiver"> <गतिविधि एंड्रॉयड: नाम = "HelloAndroid2।" एंड्रॉयड: लेबल = "@ स्ट्रिंग/app_name"> <आशय फिल्टर> <कार्रवाई एंड्रॉयड: नाम = "android.intent.action.MAIN" /> <श्रेणी एंड्रॉइड: नाम = "android.intent.category.LAUNCHER" /> [/ code] – erdomester

+0

क्षमा करें मुझे नहीं पता कि यह कोड यहां कैसा दिखाना है। – erdomester

+1

आपको इसे अपनी पोस्ट में जोड़ना चाहिए और "एडिट" जैसे कुछ पोस्ट करना चाहिए, ताकि लोग जान सकें कि यह एक अतिरिक्त जानकारी है – ccheneson

10

मुझे तब तक एक ही समस्या थी जब तक मैंने पाया कि मैंने अपने ब्रॉडकास्ट रिसीवर को एक अलग पैकेज पर नहीं रखा था, सामान्य नहीं।

सीधे शब्दों में बदल दिया है:

<receiver android:name=".AndroidAlarmService" android:enabled="true" > 

के लिए:

<receiver android:name="com.MyCompany.MyPackage.AndroidAlarmService" android:enabled="true" > 
+0

यह मेरे लिए सही काम करता है Thx¡ – Terranology

+0

धन्यवाद। यह एंड्रॉइड से एक चेतावनी होना चाहिए। मैंने एक घंटा बर्बाद कर दिया। – ahmadalibaloch

0

अगर जवाब ऊपर आप के लिए काम नहीं करता है तो का एक और तरीका किसी भी कॉलबैक प्राप्त नहीं है जब AlarmManager आग एक कालबाह्य अलार्म। PendingIntent के तत्काल पर गलत Intent भेजकर आपको इसे एक-एक करके जांचना होगा: । उदाहरण के लिए आप अपने रिसीवर में से किसी एक पर onReceive पर कॉल प्राप्त करना चाहते थे, लेकिन आपने PendingIntent को getActivity या getService के माध्यम से तुरंत चालू किया, लेकिन वास्तव में इसका मतलब getReceiver है।

अगर आप चाहते हैं Activity आशय का रिसीवर तो आप:

PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_*); 

अगर

जब PendingIntent का उदाहरण बनाकर, वहाँ इसे बनाने के लिए कई तरीके (getService, getActivity, getReceiver, getForegroundService हैं आप BroadcastReceiver इरादे के प्राप्तकर्ता चाहते हैं:

PendingIntent.getReceiver(this, 0, intent, PendingIntent.FLAG_*); 

यदि आप एक अग्रभूमि Service आशय का रिसीवर हैं:

PendingIntent.getForegroundService(this, 0, intent, PendingIntent.FLAG_*); 

यदि आप एक Service आशय का रिसीवर हैं:

PendingIntent.getService(this, 0, intent, PendingIntent.FLAG_*); 

इसके अलावा, सुनिश्चित करें कि आप उद्देश्य सही वर्ग ओर इशारा करते हैं । (उदाहरण के लिए गतिविधि, सेवा इत्यादि के लिए इरादे बनाना)।

Intent intent = new Intent(this, MyReceiver.class); // You wanted receiver 

// PendingIntent was created in such a way 
// you wanted this to be received by an activity. 
// you will not receive any call if you set it up like this. 
PendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_*); 

मैं भी इसी तरह जवाब here तैनात: अगर आप इस तरह गलत पारित आप किसी भी कॉल प्राप्त नहीं होगा।

एचटीएच

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