I am working on alarmmanager. Alarmmanager fires on time which i set.But the problem is when system or user destroy the application, alarmmanager fires again. It fires only if user once set-up the alarmmanager.I mean after reboot if user open application and close without set alarm, it doesnt fire on destroy.
But after set up, it fires on all destroys.
Here is my code:
Manifest
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".timePicker"
android:label="@string/title_activity_time_picker" >
</activity>
<service android:name=".MyAlarmService" />
<receiver android:name=".MyAlarmReceiver"/>
<uses-permission android:name="android.permission.WAKE_LOCK" />
</application>
TimePicker.class
public class timePicker extends ActionBarActivity {
private PendingIntent pendingIntent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_time_picker);
final TimePicker timePicker = (TimePicker)findViewById(R.id.timePicker);
timePicker.setIs24HourView(true);
Button tamam = (Button) findViewById(R.id.tamam);
tamam.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int hour = timePicker.getCurrentHour();
int min = timePicker.getCurrentMinute();
//Takvim tanımlaması
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.set(Calendar.HOUR_OF_DAY, hour);
calendar.set(Calendar.MINUTE, min);
calendar.set(Calendar.SECOND, 0);
Intent myIntent = new Intent(timePicker.this, MyAlarmReceiver.class);
pendingIntent = PendingIntent.getBroadcast(timePicker.this, 0, myIntent, 0);
AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE);
alarmManager.setInexactRepeating(AlarmManager.RTC, calendar.getTimeInMillis(),alarmManager.INTERVAL_DAY, pendingIntent);
Intent i = new Intent(timePicker.this, MainActivity.class);
Bundle bilgiGonder =new Bundle() ;
bilgiGonder.putInt("hour",hour);
bilgiGonder.putInt("min",min);
i.putExtras(bilgiGonder);
startActivity(i);
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_time_picker, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
MainActivty
public class MainActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
int hour,min;
TextView time = (TextView) findViewById(R.id.time);
Intent intent = getIntent();
Bundle bilgiAl = intent.getExtras();
if(bilgiAl != null) {
hour = bilgiAl.getInt("hour");
min = bilgiAl.getInt("min");
time.setText(new StringBuilder().append(hour).append(" : ").append(min));
}else{
time.setText("Ayarlanmadi");
}
//Butona basınca dıger sayfayı cagırmak
Button button_hatirlatici = (Button) findViewById(R.id.button_hatirlatici);
button_hatirlatici.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//Diger sayfamizi cagirmak icin yeni bir intent olustururuz
Intent i = new Intent(MainActivity.this, timePicker.class);
startActivity(i);
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
MyAlarmreceiver
public class MyAlarmReceiver extends BroadcastReceiver {
public void onReceive(Context context, Intent intent){
//Bu receiver MainActivity de tanımladığımız alarm manager broadcast yaptığında bu sinyali yakalayıp MyAlarmService servisini
//çalıştırır.MyAlarmService manifestte servis olarak tanımlanmıştır.
//Myreciever de manifesto da reciever olarak tanımlanmıştır.
Intent service1 = new Intent(context, MyAlarmService.class);
context.startService(service1);
}
}
MyAlarmService (it fires notification)
public class MyAlarmService extends Service {
//private NotificationManager mManager;
public IBinder onBind(Intent arg0){
return null;
}
public void onCreate(){
super.onCreate();
}
public void onStart(Intent intent, int startId){
super.onStart(intent, startId);
Uri alarmSound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
long[] pattern = {500,500,500,500,500,500,500,500,500};
NotificationManager nm = (NotificationManager) getApplicationContext().getSystemService(NOTIFICATION_SERVICE);
//Yeni bir pendingIntent açıyoruz ve içerisine de yeni bir intent oluşturuyoruz
PendingIntent pi = PendingIntent.getActivity(MyAlarmService.this, 0, new Intent(MyAlarmService.this, MainActivity.class), 0);
//Ardından notification adında bir notification yani bildirim oluşturuyoruz ve bilgilerini giriyoruz.
Notification notification =new Notification.Builder(MyAlarmService.this)
.setContentIntent(pi) // bildirime tıklayınca açılacak olan pendingintent
.setContentTitle("Bildirim Ornegi")
.setContentText("Bildirimin içindeki text")
.setSmallIcon(R.mipmap.ic_launcher)
.setAutoCancel(true) // Bildirime tıklayınca bildirim yok olsun.
.setSound(alarmSound)
.setVibrate(pattern)
.setLights(Color.BLUE,500,500)
.addAction(R.mipmap.ic_launcher, "bildirimin en alt mesajı", pi) // bildirimi açınca altta bişeyler daha çıkarıyor.
.build(); //Butun yukarda girilen özellikleri combine edip yeni notification objesi oluştur.
nm.notify(1, notification);
Can anyone help ?