Notice: iconv() [function.iconv]: Detected an illegal character in input string in /home/dkwsorgu/domains/dkws.org.ua/public_html/demo/library.php on line 218

Notice: iconv() [function.iconv]: Detected an illegal character in input string in /home/dkwsorgu/domains/dkws.org.ua/public_html/demo/library.php on line 192

Notice: iconv() [function.iconv]: Detected an illegal character in input string in /home/dkwsorgu/domains/dkws.org.ua/public_html/demo/library.php on line 169
Уведомления РІ Android 4 Рё 5 - Сайт Дениса Колисниченко
 

Дельта-синхронизация крипто-дисков

Существуют разные способы зашифровать "облако". Один из них - поместить в облако крипто-диск. В предыдущей статье мы писали, почему это не всегда удобно.

Дельта синхронизация без облака

Ранее мы показывали разные способы синхронизации криптодиска между ПК и Android-устройством.

Облачный хостинг VDS за 2 минуты

Настоящий облачный VDS-хостинг от UltraVDS: тестируем производительность

Смотрим плавность хода с помощью BMW Rheingold

Всем знакома ситуация, когда двигатель немного "троит", но пропусков зажигания нет...

Уведомления в Android 4 и 5


© Денис Колисниченко

Приложения могут отображать два типа уведомлений: краткие всплывающие сообщения (Toast Notification) и постоянные напоминания (Status Bar Notification). Первые отображаются на экране мобильного устройства какое-то время и не требуют внимания пользователя. Как правило, это не критические информационные уведомления. Вторые постоянно отображаются в строке состояния и требуют реакции пользователя.

Например, приложение требует подключение к вашему серверу. Если соединение успешно установлено, можно отобразить краткое уведомление, а вот если подключиться не получилось, тогда отображается постоянное уведомление, чтобы пользователь сразу мог понять, почему приложение не работает.

Чтобы отобразить всплывающее сообщение, используйте класс Toast и его методы makeText (создает текст уведомления) и show (отображает уведомление):

Context context = getApplicationContext();

Toast toast = Toast.makeText(context, "This is notification",

В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В  Toast.LENGTH_LONG);

toast.show();

Первый параметр метода makeText() вЂ” это контекст приложения, который можно получить СЃ помощью вызова getApplicationContext(). Второй параметр вЂ” текст уведомления. Третий вЂ” задает продолжительность отображения уведомления:

r    LENGTH_SHORT вЂ” небольшая продолжительность (1—2 секунды) отображения текстового уведомления;

r    LENGTH_LONG вЂ” показывает уведомление РІ течение более длительного периода времени (примерно 4 секунды).

По умолчанию всплывающее уведомление появится в нижней части экрана. Чтобы отобразить уведомление в другом месте (специально для dkws.org.ua), можно воспользоваться методом setGravity(), который нужно вызвать до метода show():

toast.setGravity(Gravity.CENTER, 0, 0);

Первый параметр задает размещение РІ пределах большего контейнера, например, GRAVITY.CENTER, GRAVITY.TOP Рё С‚. Рґ. Второй параметр вЂ” это смещение РїРѕ РѕСЃРё X, третий вЂ” смещение РїРѕ РѕСЃРё Y.

В нашем примере уведомление будет отображено по центру окна.

Теперь немного практики. Создайте новый проект (пусть РѕРЅ называется Test6 вЂ” для совместимости СЃ РјРѕРёРј РєРѕРґРѕРј), разметку можете РЅРµ изменять, Р° можете вообще удалить РІСЃРµ элементы деятельности. Наше приложение отобразит РїСЂРё запуске уведомление (СЂРёСЃ. 1).

Рис. 1. Всплывающее уведомление

Java-код приложения представлен в листинге 1.

Листинг 1. Отображение всплывающего уведомления

package com.samples.test6;

import android.app.Activity;

import android.os.Bundle;

import android.widget.Toast;

import android.content.Context;

import android.view.Gravity;

public class Test6Activity extends Activity {

В В В  /** Called when the activity is first created. */

В В В  @Override

В В В  public void onCreate(Bundle savedInstanceState) {

В В В В В В В  super.onCreate(savedInstanceState);

В В В В В В В  setContentView(R.layout.main);

В В В В В В В  Context context = getApplicationContext();

В В В В В В В  Toast toast = Toast.makeText(context, "This is notification", Toast.LENGTH_SHORT);

В В В В В В В  toast.setGravity(Gravity.CENTER, 0, 0);

В В В В В В В  toast.show();

В В В  }

}

Создать уведомление в строке состояния немного сложнее. А тем более в современных версиях Android. Ведь раньше для создания таких уведомлений использовались классы Notification и NotificationManager. В Android 4 и 5 вместо класса Notification нужно использовать класс Notification.Builder. В листинге 6.2а приводится старая версия кода, а в листинге 6.2б - новая (чтобы вы могли сравнить).

Листинг 6.2а. Старая версия кода (классы Notification и NotificationManager)

int NOTIFY_ID = 101;

Context context = getApplicationContext();

NotificationManager Mgr = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);

int icon = R.drawable.icon;

CharSequence cText = "Ошибка!";

long t = System.currentTimeMillis();

Notification notify = new Notification(icon, cText, t);

CharSequence nTitle = "Ошибка";

CharSequence nText = "Не могу подключиться к серверу";

Intent intent = new Intent(this, Test6Activity.class);

PendingIntent cIntent = PendingIntent.getActivity(this, 0, intent, 0);

notify.setLatestEventInfo(context, nTitle, nText, cIntent);

Mgr.notify(NOTIFY_ID, notify);

Листинг 6.2б. Новая версия кода для Android 4 и 5 (класс Notification.Builder)

package com.glava.glava6;

import android.support.v7.app.ActionBarActivity;

import android.os.Bundle;

import android.view.Menu;

import android.view.MenuItem;

import android.content.Context;

import android.app.Notification;

import android.app.NotificationManager;

import android.app.PendingIntent;

import android.content.Intent;

import android.content.res.*;

public class MainActivity extends ActionBarActivity {

В В В В В В В 

В В В В В В В  private static final int NOTIFY_ID = 101;

В В В  @Override

В В В  protected void onCreate(Bundle savedInstanceState) {

В В В В В В В  super.onCreate(savedInstanceState);

В В В В В В В  setContentView(R.layout.activity_main);

В В В В В В В 

В В В В В В В  Context context = getApplicationContext();

В В В В В В В  Intent notificationIntent = new Intent(context, MainActivity.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)

В В В В В В В В В В В В В В В  .setSmallIcon(R.drawable.ic_launcher)

                 // большая картинка

В В В В В В В В В В В В В В В  В // .setLargeIcon(R.drawable.ic_launcher)

                 //.setTicker(res.getString(R.string.warning)) // текст в строке состояния

                .setTicker("Ошибка!")

В В В В В В В В В В В В В В В  .setWhen(System.currentTimeMillis()В В В 

В В В В В  В В В В В В В В .setAutoCancel(true)

                // Заголовок уведомления

              .setContentTitle("Ошибка!")

              // Текст уведомления

                .setContentText("Не могу подключиться к серверу");            

В В В В В В В В В В В В В В В  Notification n = builder.getNotification();

В В В В В В В В В В В В В В В  //Notification n = builder.build();

В В В В В В В В В В В В В В В  nm.notify(NOTIFY_ID, n);

В В В  }

В В В 

}

Как вы заметили, в листинге 6.2б приводится полный код приложения, а не его фрагмент. Код хоть и хорошо закомментирован, но есть некоторые нюансы, которые вам следует знать. Метод setSmallIcon() формирует маленькую картинку уведомления, а setLargeIcon() - большую. Я большую не указывал, поскольку мне было лень ее готовить для демо проекта. Однако в реальном приложении вы будете использовать этот метод. Метод setTicker() устанавливает текст сообщения в строке состояния, которое исчезнет, как только вы просмотрите уведомление, останется только картинка, заданная с помощью setSmallIcon(). Методы setContentTitle() и setContentText() задают, соответственно, заголовок и текст уведомления.

Метод getNotification() уже считается устаревшим Рё вместо него нужно использовать метод build(). Однако метод build() РІС‹ можете использовать, только если минимальный уровень API РІ настройках проекта будет 16 (Android 4.1.2).  Поэтому если РІС‹ пишете приложение для самых современных версий Android, устанавливайте минимальный уровень API 16 или выше (© Денис Колисниченко dkws.org.ua) Рё используйте метод build(). Если же вам нужно написать приложение, которое должно работать пусть РЅРµ РІ самых древних версиях (та же 4.0 - это API 15), тогда используйте метод getNotification() Рё РЅРµ обращайте внимание РЅР° предупреждение РѕР± устаревшем РєРѕРґРµ. Приложения СЃ этим методом Р±СѓРґСѓС‚ нормально выполняться Рё РЅР° более новых версиях Android. Результат наших стараний приведен РЅР° СЂРёСЃ. 6.2.

Рис. 6.2. Уведомление в строке состояния (Android 4.4)

Но это еще не все. Вы можете отменить собственные уведомления, когда в них уже нет необходимости (например, ваша программа уже может установить соединение с сервером, а уведомление об ошибке все еще продолжает "висеть" в строке уведомления):

nm.cancel(NOTIFY_ID); // nm - экземпляр класса NotificationManager

Если нужно в уведомлении выводить индикатор прогресса (вы видели такой при установке программ из Play Market), используйте метод setProgress():

setProgress(100, 75, false);

При появлении уведомления можно заставить смартфон звучать (SOUND), вибрировать (VIBRATE), а также мерцать (LIGHT). Для всего этого используются следующие константы:

r    Notification.DEFAULT_SOUND

r    Notification.DEFAULT_VIBRATE

r    Notification.DEFAULT_LIGHTS

Нужное поведение задается так:

notification.defaults = Notification.DEFAULT_SOUND |

В В В В В В В  Notification.DEFAULT_VIBRATE;

Если вам нужно все и сразу, используйте константу Notification.DEFAULT_ALL. Для доступа к виброзвонку в файл манифеста нужно добавить строчку:

<uses-permission android:name="android.permission.VIBRATE"/>