powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Android [игнор отключен] [закрыт для гостей] / Android:что не так с Broadcast receiver?
7 сообщений из 7, страница 1 из 1
Android:что не так с Broadcast receiver?
    #38339676
Фотография VladislavVV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В продолжении http://www.sql.ru/forum/1033973/android-ustanovit-sobytiya-v-alarmmanager-posle-rebuta-ustroystva] этой темы

класс, который получет уведомление системы о перезагрузке (прошу прощения за разметку, ADT такое творит)
класс перебирает курсор и запихивает данные в AlarmManager ( new AlarmTask ....)

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
package com.xxx.aurora;

import java.util.Calendar;

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

/**
 * 
 * Класс получает уведомление о перезагрузке системы и устанавливает alarm
 * task's в alarm manager
 * 
 * @author
 * 
 */
public class AuroraAlarmsSetter extends BroadcastReceiver
	{

		@Override
		public void onReceive(Context context, Intent intent)
			{
				if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED))
					{
						new SetSchAlarmTask(context).run();// счетчики
					}

			}

		/**
		 * 
		 * счетчики
		 * 
		 */
		private class SetSchAlarmTask implements Runnable
			{
				private DB						db;
				private Context	ctx;

				public SetSchAlarmTask(Context ctx)
					{
						this.ctx = ctx;

						db = new DB(ctx, Const.appDebugMode);
						db.open();

						if (ctx == null || db == null)
							return;
						
						Log.d(Const.LOG_TAG, "SetSchAlarmTask constr");
					}

				@Override
				public void run()
					{
						Cursor cursor = new TBL_Spr_Sch(db.getDB()).getAllReminderData();
						if (cursor != null)
							{
								Integer count = cursor.getCount();
								Log.d(Const.LOG_TAG, "count="+count.toString());
								if (count != 0)
									{
										Log.d(Const.LOG_TAG, "!= 0");
										if (cursor.moveToFirst())
											{
												Log.d(Const.LOG_TAG, "moveToFirst");
												do
													{
														Long id = cursor.getLong(cursor.getColumnIndex(TBL_Spr_Sch.ID));
														Log.d(Const.LOG_TAG, "id="+id.toString());
														
														Calendar c = Calendar.getInstance();
														c.set(Calendar.HOUR_OF_DAY,
																cursor.getInt(cursor.getColumnIndex(TBL_Spr_Sch.CHREMINDER)));
														c.set(Calendar.MINUTE,
																cursor.getInt(cursor.getColumnIndex(TBL_Spr_Sch.MINREMINDER)));
														c.set(Calendar.SECOND, 0);
														c.set(Calendar.MILLISECOND, 0);
														c.set(Calendar.YEAR,
																cursor.getInt(cursor.getColumnIndex(TBL_Spr_Sch.YREMINDER)));
														c.set(Calendar.MONTH,
																cursor.getInt(cursor.getColumnIndex(TBL_Spr_Sch.MREMINDER) - 1));
														c.set(Calendar.DAY_OF_MONTH,
																cursor.getInt(cursor.getColumnIndex(TBL_Spr_Sch.DREMINDER)));

														Integer requestCode = Integer.parseInt(id.toString());
														new AlarmTask(ctx, c, AuroraNotifReceiver.ACTION_RECEIVE_SCH, id,
																requestCode, AlarmTask.ALARMTASK_EVENT_SET).run();

													} while (cursor.moveToNext());
											}// cursor.moveToFirst()
									}// count!=0
							}// cursor!=null
						if (cursor != null)
							cursor.close();
						if (db != null)
							db.close();
					}
			}// SetSchAlarmTask

	}




класс Ararmtask
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
package com.xxx.aurora;

import java.util.Calendar;

import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.util.Log;

/**
 * Класс "устанавливает" задание в Alarm Manager
 * 
 * @author 
 * 
 */

public class AlarmTask implements Runnable
	{
		public static final Integer	ALARMTASK_EVENT_SET				= 1;
		public static final Integer	ALARMTASK_EVENT_CANCEL	= 2;

		private Calendar												date;
		private AlarmManager								am;
		private Context													context;
		private String														actionName;
		private Integer													requestCode;
		private Long																ID;
		private Integer													event;

		/**
		 * Класс "устанавливает" задание в Alarm Manager
		 * 
		 * @author 
		 * @param c
		 *         - context
		 * @param d
		 *         - дата/время события
		 * @param actionName
		 *         - имя события /типа ACTION_RECEIVE_SCH/
		 * @param ID
		 *         - id из БД
		 * @param requestCode
		 *         - PendingIntent's requestCode
		 * @param event
		 *         - тип события: ALARMTASK_EVENT_SET - установить alarmtask,
		 *         ALARMTASK_EVENT_CANCEL - удалить alarmtask
		 */

		public AlarmTask(Context c, Calendar d, String actionName, Long ID,
				Integer requestCode, Integer event)
			{
				context = c;
				if (context == null)
					return;

				date = d;
				am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);

				this.actionName = actionName;
				this.ID = ID;
				this.requestCode = requestCode;
				this.event = event;
				
				Log.d(Const.LOG_TAG, "AlarmTask constr   ID="+ID.toString());
			}

		/**
		 * Метод устанавливает\отменяет  событие
		 */

		@Override
		public void run()
			{
				Log.d(Const.LOG_TAG, "AlarmTask run");
				Intent intent = new Intent(context, AuroraNotifReceiver.class);
				intent.putExtra(AuroraNotifReceiver.ACTION_ID, ID);
				intent.setAction(actionName);
				
				PendingIntent pendingIntent = PendingIntent.getBroadcast(context,
						requestCode, intent, PendingIntent.FLAG_CANCEL_CURRENT);

				if (event == ALARMTASK_EVENT_SET)
					am.set(AlarmManager.RTC, date.getTimeInMillis(), pendingIntent);

				if (event == ALARMTASK_EVENT_CANCEL)
					am.cancel(pendingIntent);
			}

	}



вопрос: когда я вызываю вот так (просто по клику на button, например) - работает! ура!

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
private void SetAlarmTask(Long ID, ContentValues data, Integer event)
			{
				Calendar c = Calendar.getInstance();
				c.set(Calendar.HOUR_OF_DAY, data.getAsInteger(TBL_Spr_Sch.CHREMINDER));
				c.set(Calendar.MINUTE, data.getAsInteger(TBL_Spr_Sch.MINREMINDER));
				c.set(Calendar.SECOND, 0);
				c.set(Calendar.MILLISECOND, 0);
				c.set(Calendar.YEAR, data.getAsInteger(TBL_Spr_Sch.YREMINDER));
				c.set(Calendar.MONTH, data.getAsInteger(TBL_Spr_Sch.MREMINDER) - 1);
				c.set(Calendar.DAY_OF_MONTH, data.getAsInteger(TBL_Spr_Sch.DREMINDER));

				Integer requestCode = Integer.parseInt(ID.toString());
				new AlarmTask(this, c, AuroraNotifReceiver.ACTION_RECEIVE_SCH, ID,
						requestCode, event).run();
			}




когда перегружаю смарт - класс AuroraAlarmsSetter не отрабатывает
срабатывает только тогда, когда загружаю приложение (видно по логам), но AlarmManager, сцуко, не отрабатывает ни в том, нИ в том случае. WTF?

манифест
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.xxx.aurora"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="17" />
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>

    <application
...      
        <activity
            ...
        </activity>

        <receiver             
            android:name="AuroraAlarmsSetter"
            android:exported="false">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED"/>
            </intent-filter>
        </receiver>
        
    </application>

</manifest>


и еще, подскажите, как можно перегрузить AVD? или только вкл/выкл ?

спс
...
Рейтинг: 0 / 0
Android:что не так с Broadcast receiver?
    #38340002
Фотография VladislavVV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вопрос закрыт
вот так работает

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
/**
		 * 
		 * счетчики
		 * 
		 */
		private class SetSchAlarmTask implements Runnable
			{
				private DB						db;
				private Context	ctx;

				public SetSchAlarmTask(Context ctx)
					{
						this.ctx = ctx;

						db = new DB(ctx, Const.appDebugMode);
						db.open();

						if (ctx == null || db == null)
							return;

						Log.d(Const.LOG_TAG, "SetSchAlarmTask constr");
					}

				@Override
				public void run()
					{
						Cursor cursor = new TBL_Spr_Sch(db.getDB()).getAllReminderData();
						if (cursor != null)
							{
								Integer count = cursor.getCount();
								Log.d(Const.LOG_TAG, "count=" + count.toString());
								if (count != 0)
									{
										Log.d(Const.LOG_TAG, "!= 0");
										if (cursor.moveToFirst())
											{
												Log.d(Const.LOG_TAG, "moveToFirst");
												do
													{
														Long id = cursor.getLong(cursor.getColumnIndex(TBL_Spr_Sch.ID));
														Log.d(Const.LOG_TAG, "id=" + id.toString()+"---------------------------------");

														Integer hour = cursor.getInt(cursor
																.getColumnIndex(TBL_Spr_Sch.CHREMINDER));
														Integer min = cursor.getInt(cursor
																.getColumnIndex(TBL_Spr_Sch.MINREMINDER));
														Integer y = cursor.getInt(cursor
																.getColumnIndex(TBL_Spr_Sch.YREMINDER));
														Integer m = cursor.getInt(cursor
																.getColumnIndex(TBL_Spr_Sch.MREMINDER))-1;
														Integer d = cursor.getInt(cursor
																.getColumnIndex(TBL_Spr_Sch.DREMINDER));
																
														Log.d(Const.LOG_TAG,
																hour.toString() + ":" + min.toString() + "--- " + d.toString()
																		+ "." + m.toString() + "." + y.toString());

														Calendar c = Calendar.getInstance();
              c.clear();
														c.set(Calendar.HOUR_OF_DAY, hour);
														c.set(Calendar.MINUTE, min);
														c.set(Calendar.SECOND, 0);
														c.set(Calendar.MILLISECOND, 0);
														c.set(Calendar.YEAR, y);
														c.set(Calendar.MONTH, m);
														c.set(Calendar.DAY_OF_MONTH, d);

														Log.d(Const.LOG_TAG, c.toString());

														Integer requestCode = Integer.parseInt(id.toString());
														new AlarmTask(ctx, c, AuroraNotifReceiver.ACTION_RECEIVE_SCH, id,
																requestCode, AlarmTask.ALARMTASK_EVENT_SET).run();

													} while (cursor.moveToNext());
											}// cursor.moveToFirst()
									}// count!=0
							}// cursor!=null
						if (cursor != null)
							cursor.close();
						if (db != null)
							db.close();
					}
			}// SetSchAlarmTask



зы - имхо, тот баран, который придумал январь начинать с 0 - думал явно жопой
...
Рейтинг: 0 / 0
Android:что не так с Broadcast receiver?
    #38340086
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
стоит ничего не ответить как человек сам разберется :-)

з.ы. кусок с проходом по курсору - жесть.
1) нафига проверять его на null?
2) нафига проверять на кол-во записей
3) зачем проверять вернул ли cursor.moveToFirst() true, если уже проверили, что записей больше нуля? ты пессимист?

вся порнография выше заменяется строчками
Код: java
1.
2.
3.
4.
while (cursor.moveToNext())
{
   ...
}



з.з.ы.
зачем тебе куча Runnable, если ты их вызываешь напрямую, а не асинхронно? на всякий случай?
...
Рейтинг: 0 / 0
Android:что не так с Broadcast receiver?
    #38340322
Фотография VladislavVV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chpasha, хоть кто то ответил
спс
по курсору - это все ради безопасности. типа хороший стиль программирования...я ж нуб в яве - что буржуи пишут - то и принимаю на веру.

по кол-ву записей - их может быть = 0 - тогда и не бергаемся
а moveToFirst - для организации цикла, а иначе - ошибка что то типа illegal argument position bla bla bla не помню

по поводу
Код: java
1.
2.
3.
4.
while (cursor.moveToNext())
{
   ...
}


спс - гляну

по поводу runnable - ну так хз чем может мой андроид ща быть занят, поэтому в отдельном потоке выполняю
как то так
...
Рейтинг: 0 / 0
Android:что не так с Broadcast receiver?
    #38340391
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VladislavVVchpasha, хоть кто то ответил
спс
по курсору - это все ради безопасности
нету никакой безопасности, запрос не может вернуть null, будет пустой курсор.

VladislavVVпо кол-ву записей - их может быть = 0 - тогда и не бергаемся
лишняя проверка

VladislavVVа moveToFirst - для организации цикла, а иначе - ошибка что то типа illegal argument position bla bla bla не помню
курсор после создания находится на позиции "до первой записи". moveToNext делает в этой ситуации тоже самое, что moveToFirst. moveToFirst нужен совсем для другого, а именно для возвращения в начало.

VladislavVVwhile (cursor.moveToNext())
только так и надо. следите за "правильными" ответами на stackoverflow - там тусуются такие люди, что соврать не дадут, а не за всем, что по-английски пишут.

VladislavVVпо поводу runnable - ну так хз чем может мой андроид ща быть занят, поэтому в отдельном потоке выполняю
это ты так думаешь. runnable.run() выполняется в том же потоке линейно. кстати это тебя и спасло. читаем:

apiA BroadcastReceiver object is only valid for the duration of the call to onReceive(Context, Intent). Once your code returns from this function, the system considers the object to be finished and no longer active.

This has important repercussions to what you can do in an onReceive(Context, Intent) implementation: anything that requires asynchronous operation is not available, because you will need to return from the function to handle the asynchronous operation, but at that point the BroadcastReceiver is no longer active and thus the system is free to kill its process before the asynchronous operation completes.

т.е. никаких асинхронных операций там быть не должно. как только происходит возврат из метода, процесс будет в скорости убит (а твои потоки еще шуршат). Если нужно делать что-то асинхронно, нужно старовать сервис из броадкаста. но как я уже сказал, твои вызовы run() линейны, так что Runnable в этой ситуации просто бесполезны. если бы ты их запускал правильно, они бы были даже вредны - не все таймеры успели бы установиться (а то и вовсе ни один не успел бы).
...
Рейтинг: 0 / 0
Android:что не так с Broadcast receiver?
    #38341130
Фотография VladislavVV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chpasha, спс за советы! прислушаюсь!
...
Рейтинг: 0 / 0
Android:что не так с Broadcast receiver?
    #38341131
Фотография VladislavVV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
подскажите, как можно перегрузить AVD? или только вкл/выкл ?
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Android [игнор отключен] [закрыт для гостей] / Android:что не так с Broadcast receiver?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]