Страницы

Поиск по вопросам

среда, 12 июня 2019 г.

Push уведомления

В фоновом режиме приложение отправляет запросы на сервер, в цикле. По задумке если ответ сервера содержит 1, надо отправить пуш уведомление. Код работает но оповещение нельзя закрыть и при переходе по уведомлению оно не пропадает.И еще, когда сервер выводит 1 , оповещения приходят до тех пор пока 1 не сменится 0, как можно это исправить?
public class MyService1 extends Service { public MyService1() { } private final int NOTIFICATION_ID = 38; private NotificationManager nn; String q = "http://site/new.php"; public void onCreate(){ super.onCreate(); new JSON().execute(q); }
@Override public IBinder onBind(Intent intent) { // TODO: Return the communication channel to the service. throw new UnsupportedOperationException("Not yet implemented"); }
public class JSON extends AsyncTask {
@Override protected String doInBackground(String... params) {
HttpURLConnection connection = null; BufferedReader reader = null; while (true) { onCreate(); try {
URL url = new URL(params[0]); connection = (HttpURLConnection) url.openConnection(); connection.connect();
InputStream stream = connection.getInputStream();
reader = new BufferedReader(new InputStreamReader(stream));
StringBuffer buffer = new StringBuffer();
String line = ""; while ((line = reader.readLine()) != null) { buffer.append(line); } return buffer.toString();
} catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { if (connection != null) { connection.disconnect(); } try { if (reader != null) { reader.close(); } } catch (IOException e) { e.printStackTrace(); } } return null; } }
@Override protected void onPostExecute(String result) { super.onPostExecute(result);
if (result.contains("1")) {
Notification.Builder builder = new Notification.Builder(getApplicationContext()); Intent intent = new Intent(getApplicationContext(),MainActivity.class); PendingIntent pendingIntent = PendingIntent.getActivity(getApplicationContext(), 0,intent,PendingIntent.FLAG_CANCEL_CURRENT); builder .setContentIntent(pendingIntent) .setSmallIcon(R.drawable.ic_action_name) .setLargeIcon(BitmapFactory.decodeResource(getApplication().getResources(),R.drawable.ic_action_name)) .setTicker("new messsege") .setWhen(System.currentTimeMillis()) .setAutoCancel(true) .setContentTitle("Not") .setContentText("put this mess"); Notification notification = builder.build();
notification.defaults = Notification.DEFAULT_VIBRATE;
startForeground(37,notification); } else {
} } }
}


Ответ

Во-первых, то, что Вы называете "пуш уведомлением" называется нотификацией или уведомлением. Push-сообщение -- это порция данных, которую Вам может прислать сервер. В вашем примере push-сообщения не используются.
Во-вторых, Вы не просто показываете нотификацию, а запускаете foreground сервис, в таком случае нотификацию нельзя просто смахнуть свайпом, ведь она связана с высоко приоритетной выполняющейся задачей. Если Вы действительно хотите запускать foreground сервис, то нотификация пропадёт только когда Ваше приложением вызовет stopForeground или когда пользователь убьёт его в настройках или по долгому тапу, если оболочка это позволяет (не через кнопку последних приложений).
В-третьих, если Вам нужно просто показать нотификацию, то необходимо воспользоваться NotificationManager, примеры тут и тут. С его же помощью нотификацию также можно удалить программно. Обратите внимание на установку PendingIntent в примерах, если необходимо что-то делать по нажатию на нотификацию.

Комментариев нет:

Отправить комментарий