저희가 하려고 하는 것은 타임 피커에서 받아온 시간을 db에 넣고 받아와서

정해놓은 시간이 되면 어플을 켜지 않아도 push가 오게 하는 것입니다.

그런데 자꾸 지정한 시간이 아니여도 한번 서비스로 넘어가게되면 푸시가 계속 옵니다.

왜이럴까용????

 

 

맨처음 목록을 보여주는 액티비티 입니다.

여기서 intent를 통해 시간을 불러와서 알람매니저를 발생시키는 서비스로 이동시킵니다.

 

 Intent push = new Intent(MySubActivity.this, PushSetting.class);
 startService(push);

 

 

 

 

밑의 코드는 알람매니저를 발생시키는 서비스 클래스의 코드 일부입니다.

 

 

public void onStart(Intent intent, int startId) {
   super.onStart(intent, startId);
  
   
   int mode_id=0;
   int count;
   int day=0;
   int hour;
   int min;
   
   int check_sun=0;
   int check_mon=0;
   int check_tue=0;
   int check_wed=0;
   int check_thu=0;
   int check_fri=0;
   int check_sat=0;
   
   

//위의 변수들은 월요일부터 일요일까지의 요일과 시간, 분을 받는 변수이며

//하위의 체크 sun은 밑의 for문을 돌면서 그때그때 day값을 바꾸어 알람매니저를 발생시킬때 쓰는 변수입니다.


   mDb = new DBAdapter(this);
   alarm_list = mDb.getAllAlarm();
   count = mDb.countAlarm(); // countAlarm()메소드는 데이터베이스 리스트에 있는 모든 값을 읽으면서 count를 하나씩 증가시켜 그 수를 받아옵니다. 
   
   if(count==0)
   ;

   else{
    while(mode_id < count)   

  {
     Toast.makeText(PushSetting.this, "count" + Integer.toString(count), Toast.LENGTH_SHORT).show();
     
     selected_alarm = alarm_list.get(mode_id); // mode_id가 0부터 count보다 작을 때 까지 증가하면서 디비에 접근해 리스트에서 alarm필드를 받아옵니다. 
     if(selected_alarm == null) // 만약 id값이 없어 삭제가 된 경우 null을 반환하는 것이 맞나요? 에러는 나지않지만 가끔 한줄위에서
indexofboundException이 생깁니다.       ;
     else
     {
      //count--;    
      for(int i = 0; i<7 ; i++ )
      {
              
       day=0;
       check_sun=0;
       check_mon=0;
       check_tue=0;
       check_wed=0;
       check_thu=0;
       check_fri=0;
       check_sat=0;
       
       
       if(selected_alarm.getSun()==1 && check_sun!=1){
        day = 1;
        check_sun=1;
       }
       else if(selected_alarm.getMon()==1 && check_mon!=1){
        day = 2;
        check_mon=1;
       }
       else if(selected_alarm.getTue()==1 && check_tue!=1){
        day = 3;
        check_tue=1;
       }
       else if(selected_alarm.getWed()==1 && check_wed!=1){
        day = 4;
        check_wed=1;
       }
       else if(selected_alarm.getThu()==1 && check_thu!=1){
        day = 5;
        check_thu=1;
       }
       else if(selected_alarm.getFri()==1 && check_fri!=1){
        day = 6;
        check_fri=1;
       }
       else if(selected_alarm.getSat()==1 && check_sat!=1){
        day = 7;
        check_sat=1;
       }
       else
        i=7;
       
       hour = selected_alarm.getHour();
       min = selected_alarm.getMin();
       
             
             Calendar calendar = Calendar.getInstance();
       calendar.setTimeInMillis(System.currentTimeMillis());
       
       calendar.set(Calendar.DAY_OF_WEEK, day);
             calendar.set(Calendar.HOUR_OF_DAY, hour);
             calendar.set(Calendar.MINUTE, min);
             calendar.set(Calendar.SECOND, 0);
             calendar.set(Calendar.MILLISECOND, 0);
             //inten.putExtra("min", Calendar.MINUTE);
            
           
       AlarmManager am = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
       Intent inten = new Intent(this, PushActivity.class);
             inten.putExtra("id11",mode_id);
       sender = PendingIntent.getBroadcast(this, 0, inten, 0);
             am.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), sender);
           
             //위의 부분이 알람매니저를 호출하는 부분입니다.     sender를 통해 다음 으로 넘어가게 됩니다.
             
      }
     
    }++mode_id;
   }
   }mDb.close();

 

 

 

넘어간 액티비티 에서는 BroadcastReceiver를 extends해서 onReceive 안에서

Intent p = new Intent(context, AlarmSelectActivity.class);
  // p.putExtra("id", id1);
   p.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK );
   context.startActivity(p);

 

를 통해 푸시를 하는 액티비티로 이동시킵니다.

 

 

푸시액티비티에서는 그냥 푸시를 오게하는 역할을 합니다.