2011-12-09 11 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クラスです:

 <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> 

誰かが私に私が間違っているのかについてのアドバイスをお願いできます:

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"); 
     } 
    } 

ここに私のマニフェストファイルです。以下は

は私のデバッグの出力である:あなたが作成する必要が最初に

<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つの選択肢は、BRをサービスに変え、保留中の意図を変更してそのサービスを開始することです。

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

関連する問題