В фоновом режиме приложение отправляет запросы на сервер, в цикле.
По задумке если ответ сервера содержит 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 в примерах, если необходимо что-то делать по нажатию на нотификацию.
Комментариев нет:
Отправить комментарий