2011-12-09 41 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中查找,而不是在當前存在於您的問題中的callstack中。 – Thomas

相關問題