2011-12-09 2 views
0

Мне тяжело обворачивать голову вокруг программирования моего AlarmManager.AlarmManager и как его настроить

Код, приведенный ниже, просто присваивает текущую дату текстовому полю и получает некоторый XML и показывает его с помощью setListAdapter. Я бы хотел, чтобы этот код запускался при запуске, а затем запускался каждые 30 минут.

 Date anotherCurDate = new Date(); 
      SimpleDateFormat formatter = new SimpleDateFormat("EEEE', 'MMMM dd', ' yyyy"); 
      String formattedDateString = formatter.format(anotherCurDate); 

     TextView currentRoomDate = (TextView) this.findViewById(R.id.CurrentDate); 
     currentRoomDate.setText(formattedDateString); 

ArrayList<HashMap<String, String>> mylist = new ArrayList<HashMap<String, String>>(); 


     String xml = XMLfunctions.getXML(items); 
     Document doc = XMLfunctions.XMLfromString(xml); 

     /*int numResults = XMLfunctions.numResults(doc); 

     if((numResults <= 0)){ 
      Toast.makeText(MeetingManager.this, "NOT GETTING XML", Toast.LENGTH_LONG).show(); 
      finish(); 
     } */ 

     Element docElem = doc.getDocumentElement(); 
     NodeList nodes = (NodeList)docElem.getElementsByTagName("meeting_item"); 

int node_number = nodes.getLength(); 
String node_final = String.valueOf(node_number); 

     Log.d(TAG, node_final); 

     for (int i = 0; i < nodes.getLength(); i++) {       
      HashMap<String, String> map = new HashMap<String, String>();  

      Element e = (Element)nodes.item(i); 

      String date_value = XMLfunctions.getValue(e, "date"); 

      // Log.d(TAG, date_value); 
      //Log.d(TAG, formattedDateString); 
       //if (date_value == formattedDateString){ 
        map.put("time", XMLfunctions.getValue(e, "time")); 
        map.put("endtime", XMLfunctions.getValue(e, "endtime")); 
        map.put("name", XMLfunctions.getValue(e, "meeting_name")); 
        map.put("hostname", XMLfunctions.getValue(e, "host_name")); 
        mylist.add(map); 
       //} 


     }  

     ListAdapter adapter = new SimpleAdapter(MeetingManager.this, mylist , R.layout.listlayout, 
         new String[] {"time","endtime", "name", "hostname" }, 
         new int[] { R.id.time, R.id.endtime, R.id.meeting_name, R.id.host }); 

     setListAdapter(adapter); 





    Intent mRefreshIntent = new Intent().setComponent(new ComponentName(getBaseContext(), UpdateData.class)).setAction("com.MeetingManager.UpdateData"); 

    PendingIntent mPendingRefreshIntent = PendingIntent.getBroadcast(getBaseContext(), 0, mRefreshIntent, PendingIntent.FLAG_CANCEL_CURRENT); //choose your desired flag 


    AlarmManager mAlarmManager = null; 

    mAlarmManager.setInexactRepeating(AlarmManager.ELAPSED_REALTIME, System.currentTimeMillis(), AlarmManager.INTERVAL_HALF_HOUR, mPendingRefreshIntent); 

А вот мой UpdateData класс:

package com.MeetingManager; 

import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.util.Log; 

public class UpdateData extends BroadcastReceiver { 


     private static final String TAG = "MyApp"; 

     @Override 
     public void onReceive(Context context, Intent intent) { 
       Log.d(TAG, "HELLO UPDATE"); 
     } 
    } 

Вот мой файл манифеста:

 <receiver android:name="UpdateData"> 
    <intent-filter> 
     <action android:name="com.MeetingManager.UpdateData" /> 
     <action android:name="android.intent.action.BOOT_COMPLETED" /> 
     <category android:name="android.intent.category.HOME" /> 
    </intent-filter> 
</receiver> 

Может кто-нибудь пожалуйста, дайте мне совет, что я делаю неправильно.

Ниже выход моей отладки:

<terminated>MeetingManager [Android Application]  
    <disconnected>DalvikVM[localhost:8615] 
MeetingManager [Android Application]  
    DalvikVM[localhost:8615]  
     Thread [<1> main] (Suspended (exception RuntimeException)) 
      ActivityThread.performLaunchActivity(ActivityThread$ActivityRecord, Intent) line: 2663 
      ActivityThread.handleLaunchActivity(ActivityThread$ActivityRecord, Intent) line: 2679 
      ActivityThread.access$2300(ActivityThread, ActivityThread$ActivityRecord, Intent) line: 125 
      ActivityThread$H.handleMessage(Message) line: 2033 
      ActivityThread$H(Handler).dispatchMessage(Message) line: 99 
      Looper.loop() line: 123 
      ActivityThread.main(String[]) line: 4627  
      Method.invokeNative(Object, Object[], Class, Class[], Class, int, boolean) line: not available [native method] 
      Method.invoke(Object, Object...) line: 521 
      ZygoteInit$MethodAndArgsCaller.run() line: 868 
      ZygoteInit.main(String[]) line: 626 
      NativeStart.main(String[]) line: not available [native method] 
     Thread [<6> Binder Thread #2] (Running) 
     Thread [<5> Binder Thread #1] (Running) 

ответ

1

Похоже, вы пытаетесь использовать широковещательный приемник, как если бы это была услуга. Одним из вариантов было бы превращение БР в услугу и изменение ожидающего намерения запустить эту службу.

1

Сначала вы должны создать PendingIntent:

mRefreshIntent = new Intent() 
    .setComponent(new ComponentName(mContext, YourBroadcastReceiver.class)) 
    .setAction("my.package.name.YOUR_ACTION"); 
mPendingRefreshIntent = PendingIntent.getBroadcast(
    mContext, 
    0, 
    mRefreshIntent, 
    PendingIntent.FLAG_CANCEL_CURRENT); //choose your desired flag 

Вы можете установить сигнализацию, используя следующий код

mAlarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, time, yourInterval, mPendingRefreshIntent); 

Опять же, вы можете выбрать другой флаг, кроме RTC_WAKEUP.

Для выполнения кода, вам нужна своя собственной реализация BroadCastReceiver:

public class YourBroadcastReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     //execute your code here 
    } 
} 

И вам нужно зарегистрировать этот приемник в манифесте, для тревоги сгенерированных намерений, а также намерение, транслируется при загрузке системы:

<manifest> 
    ... 
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> 
    ... 
    <application> 
     ... 
     <receiver 
      android:name="YourBroadcastReceiver"> 
      <intent-filter> 
       <action android:name="my.package.name.REFRESH_WALLPAPER" /> 
       <action android:name="android.intent.action.BOOT_COMPLETED" /> 
       <category android:name="android.intent.category.HOME" /> 
      </intent-filter> 
     </receiver> 
     ... 
    </application> 
</manifest> 

Разрешение очень важно!
Надеюсь, это ответит на ваш вопрос.

+0

Я обновил свой сценарий на основе ваших отзывов, но я не получаю сообщение об ошибке, но приложение падает каждый раз. – Denoteone

+0

Для получения ошибки, пожалуйста, посмотрите в logcat, а не в стеке, которое в данный момент находится в вашем вопросе. – Thomas

Смежные вопросы