In my application i am showing a notification. From service i am sending the time of login to json. It is checking in server that is there any new data available or not if yes then through json i am getting the no of new data, and timing of latest data and i am showing it in notification. And if we click on notification it is coming into dashboard activity page and change the timing to the time of lates data. But the problem is that when i am clicking on notification, it is first coming into dashboard activity then changing the time. for that reason after 2nd time clicking notification is going away. can anyone tell me how to remove notification after 1st click in my case? Here is my code of condition to call a new notification:
public class ReviewUpdateService extends IntentService{
private Notification.Builder earthquakeNotificationBuilder;
public static final int NOTIFICATION_ID = 1;
private String user_id;
JSONObject jsonData;
private static String share_pref_time_file = "time_file";
private static String share_pref_file = "json_file";
String service_notification;
int no_of_notify;
public ReviewUpdateService() {
super("ReviewUpdateService");
}
private AlarmManager alarmManager;
private PendingIntent alarmIntent;
public void onCreate() {
super.onCreate();
alarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
SharedPreferences prefs = getSharedPreferences(share_pref_file,
Context.MODE_PRIVATE);
String strJson = prefs.getString("jsondata", "");
if (!strJson.equals("")) {
try {
jsonData = new JSONObject(strJson);
user_id = jsonData.getString(LoginActivity.KEY_UID);
} catch (JSONException e) {
e.printStackTrace();
}
}
String ALARM_ACTION = ReviewAlarmReceiver.ACTION_REFRESH_DASHBOARD_ALARM;
Intent intentToFire = new Intent(ALARM_ACTION);
alarmIntent = PendingIntent.getBroadcast(this, 0, intentToFire, 0);
earthquakeNotificationBuilder = new Notification.Builder(this);
earthquakeNotificationBuilder
.setAutoCancel(true)
.setTicker("New Review detected")
.setSmallIcon(R.drawable.icon_1);
}
public void refreshEarthquakes() {
// Get the XML
//URL url;
UserFunctions userFunctions = new UserFunctions();
SharedPreferences prefs = getSharedPreferences(share_pref_time_file,
Context.MODE_PRIVATE);
String formattedDate = prefs.getString("time", "");
try {
// Log.d("user_id", user_id);
// Log.d("time", formattedDate);
JSONObject json_city = userFunctions
.getNotification(user_id, formattedDate);
if(json_city!=null){
{
try {
String notify_get_id = json_city.getString(LoginActivity.KEY_NO_NOTIFY);
no_of_notify = Integer.parseInt(notify_get_id);
service_notification = json_city.getString(LoginActivity.KEY_SERVICE_NOTIFY);
} catch (JSONException e) {
e.printStackTrace();
}
}
if(no_of_notify > 0){
broadcastNotification(no_of_notify,"");
}
}
}
finally {
}
}
@Override
protected void onHandleIntent(Intent intent) {
int updateFreq = 1;
int alarmType = AlarmManager.ELAPSED_REALTIME_WAKEUP;
long timeToRefresh = SystemClock.elapsedRealtime() +
updateFreq*60*1000;
alarmManager.setInexactRepeating(alarmType, timeToRefresh, updateFreq*60*1000, alarmIntent);
refreshEarthquakes();
Intent broadcastIntent=new Intent();
broadcastIntent.setAction( ReviewAlarmReceiver.ACTION_REFRESH_DASHBOARD_ALARM );
sendBroadcast( broadcastIntent );
}
private void broadcastNotification(int no_of_review, String service_name) {
Intent startActivityIntent = new Intent(this, DashboardActivity.class);
startActivityIntent.putExtra("NotificationMessage", service_notification);
startActivityIntent.putExtra("flag", 1);
startActivityIntent.putExtra("notificationID", NOTIFICATION_ID);
startActivityIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
// startActivityIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK| Intent.FLAG_ACTIVITY_NEW_TASK );
PendingIntent launchIntent = PendingIntent.getActivity(this, 0,
startActivityIntent, PendingIntent.FLAG_UPDATE_CURRENT);
UserFunctions userFunctions = new UserFunctions();
if (userFunctions.isUserLoggedIn(getApplicationContext())) {
startActivityIntent.putExtra("latest_time", service_notification);
Log.d("latest_time", service_notification);
startActivityIntent.putExtra("flag", 1);
earthquakeNotificationBuilder
.setContentIntent(launchIntent)
.setContentTitle(no_of_review + " " + "new review is there")
.setAutoCancel(true);
// .setContentText(service_name);
if (no_of_review > 10) {
Uri ringURI = RingtoneManager
.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
earthquakeNotificationBuilder.setSound(ringURI);
}
double vibrateLength = 100 * Math.exp(0.53 * no_of_review);
long[] vibrate = new long[] { 100, 100, (long) vibrateLength };
earthquakeNotificationBuilder.setVibrate(vibrate);
int color;
if (no_of_review < 2)
color = Color.GREEN;
else if (no_of_review < 5)
color = Color.YELLOW;
else
color = Color.RED;
earthquakeNotificationBuilder.setLights(color, (int) vibrateLength,
(int) vibrateLength);
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(NOTIFICATION_ID,
earthquakeNotificationBuilder.getNotification());
} else {
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.cancelAll();
}
}
}
And that is how i am changing the time of request for json In dashboard activity:
protected void onNewIntent(Intent intent) {
DashboardActivity.this.finish();
// -----Start New Dashboard to notification clicked----
Intent i = new Intent(DashboardActivity.this, DashboardActivity.class);
Bundle extras = intent.getExtras();
if(extras != null){
startService(new Intent(this, ReviewUpdateService.class));
if(extras.containsKey("NotificationMessage"))
{
formattedDate= extras.getString("NotificationMessage");
}
if(extras.containsKey("flag"))
{
flag= extras.getInt("flag");
}
if(extras.containsKey("notificationID"))
{
NOTIFICATION_ID= extras.getInt("notificationID");
}
}
if(flag != 0){
NotificationManager nm = (NotificationManager)
getSystemService(NOTIFICATION_SERVICE);
nm.cancel(NOTIFICATION_ID);
SharedPreferences prefs1 = getSharedPreferences(
share_pref_time_file, Context.MODE_PRIVATE);
SharedPreferences.Editor editor = prefs1.edit();
editor.remove(share_pref_time_file);
editor.clear();
editor.commit();
getApplicationContext()
.getSharedPreferences(share_pref_time_file, 0).edit()
.clear().commit();
SharedPreferences prefs2 = getSharedPreferences(
share_pref_time_file, Context.MODE_PRIVATE);
SharedPreferences.Editor editor1 = prefs2.edit();
Log.d("latest_intent_time", formattedDate);
editor1.putString("time", formattedDate);
editor1.commit();
}
startActivity(i);
super.onNewIntent(intent);
}
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
NotificationManager nm = (NotificationManager)
getSystemService(NOTIFICATION_SERVICE);
nm.cancel(NOTIFICATION_ID);
setContentView(R.layout.dashboard);
startService(new Intent(this, ReviewUpdateService.class));
...................
}
}
Maybe this answer will help others: In dashboard activity i have changed my time and save it through shared preferences. And in service class i have check that old time and the latest time are same or not. If they are same it will remove notification otherwise it will fire notification through the given condition. here is the code of broadcast notification function: