AlarmManager и как его настроить - PullRequest
0 голосов
/ 09 декабря 2011

Я с трудом нахожусь в голове, программируя мой 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) 

Ответы [ 2 ]

1 голос
/ 13 декабря 2011

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

1 голос
/ 09 декабря 2011

Сначала вам нужно создать 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>

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

...