disclaimer:
Сам не очень близок к программированию, но пытаюсь немного модифицировать приложение с открытыми исходниками.
Цель на первый взгляд довольно проста: добавить в приложение уведомление при определенных условиях.
Т.к. я новичек то для тестов добавил в приложение кнопку при нажатии которой симулируется реакция на нужное событие. И прикрутил к этой кнопке функцию вызова уведомления. (Все доработки производились в классе MainActivity.) Все работало как нужно: при нажатии кнопки вызывалось соответствующее уведомление.
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()){
case R.id.action_refresh:
refreshMenuItem = item;
// load the data from server
new RefreshData().execute();
return true;
default:
return super.onOptionsItemSelected(item);
// my added test function
case R.id.action_go:
refreshMenuItem = item;
// test alert
testAlertNotify();
return true;
}
}
public void testAlertNotify(){
JSONParse jp = new JSONParse();
Action action = jp.getAction();
SendNotification(action.getDescription());
}
public void SendNotification(String action){
Context context = getApplicationContext();
Intent notificationIntent = new Intent(context, LoginActivity.class);
PendingIntent contentIntent = PendingIntent.getActivity(context,0, notificationIntent, PendingIntent.FLAG_CANCEL_CURRENT);
NotificationManager nm = (NotificationManager) context
.getSystemService(Context.NOTIFICATION_SERVICE);
Resources res = context.getResources();
Notification.Builder builder = new Notification.Builder(context);
builder.setContentIntent(contentIntent)
// try vibrate
.setVibrate(new long[]{0, 200, 200, 600, 600})
.setSmallIcon(R.drawable.run_icon)
// большая картинка
.setLargeIcon(BitmapFactory.decodeResource(res, R.drawable.run_icon))
//.setTicker(res.getString(R.string.warning)) // текст в строке состояния
.setTicker("Тестовое оповещение" + action)
.setWhen(System.currentTimeMillis()) // java.lang.System.currentTimeMillis()
.setAutoCancel(true)
.setContentTitle("Action = " + action)
.setContentText("Action = " + action); // Текст уведомленимя
// try sound
Uri uri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
builder.setSound(uri);
Notification n = builder.getNotification();
nm.notify(101, n);
}
Сложности начались при попытке вызвать функцию уведомления из другого класса с порверками по таймауту. Для чего был создан класс SmartCheckerTimer с функцией из которой я пытаюсь вызвать запуск уведомления после изменения тестового значения. Счетчик работает в штатном режиме, но после достижения порогового значения(
GlobalVars_my) останавливается. (проверял вызывая в приложении Alert со значением тестовой переменной, костыльный способ но другой мне не ведом) Вобщем попытки разобраться были разнообразнейшими, и класический вызов и наследование класса MainActivity c последующей попыткой вызова нужной функции, и добавление в класс SmartCheckerTimer дубликата функции для вызова уведомления(SendNotification1). Но чувствую копаю не в ту сторону и уперся в стенку.
Последний описаный вариант: добавление в класс SmartCheckerTimer дубликата функции (SendNotification1) для вызова уведомления.@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
@Override
public void run() {
try {
_detector = new ConnectionDetector(_context);
while (true) {
SendNotification1(action.getDescription());
// Через 10 секунд еще раз получаем данные
Thread.sleep(10000);
if (_detector.isConnectingToInternet()) {
GlobalVars_my.countVar++;
if (GlobalVars_my.countVar >= 2) {
SendNotification1(action.getDescription());
}
}
}
} catch (Exception exception) {
ErrorsList.AddError(exception.toString());
}
}