2017-09-12 3 views
-2

나는 안드로이드 개발을 처음 사용하고 있습니다. 나는 sqlite db에서 알람을 설정하고 시간과 날짜에 알람을 가져오고 싶습니다. BroadcastReceiver 클래스를 확장하여 사용하고 서비스를 확장하는 것을 보려고 최선을 다했습니다. 그러나 couldnt입니다. 여기에 브로드 캐스트 리시버브로드 캐스트 클래스와 서비스 클래스를 사용하는 SQLite, 알람 관리자

public class MyReceiver extends BroadcastReceiver { 

@Override 
public void onReceive(Context context, Intent intent) { 
      if (intent.getAction().equalsIgnoreCase(Intent.ACTION_BOOT_COMPLETED)) { 
     Intent serviceIntent = new Intent(context, MyService.class); 
     context.startService(serviceIntent); 
    } 
    } 

}

및 다른 클래스의 코드는, 즉 서비스 클래스입니다. 여기에 코드

@Override 
public IBinder onBind(Intent intent) { 
     return null; 
} 

@Override 
public void onCreate() { 
    super.onCreate(); 
    Calendar calender = Calendar.getInstance(); 
    calender.clear(); 
    SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy"); 
    SimpleDateFormat formatt = new SimpleDateFormat("hh:mm"); 

    CharSequence text = format.format(new Date()); 
    ; 
    CharSequence time = formatt.format(new Date()); 
    ; 
    String sql = String.format("SELECT * FROM comments_table WHERE time = '" + String.valueOf(time) + "'" + 
      "and date = '%s'", String.valueOf(text) + ""); 
    Cursor c = db.rawQuery(sql, null); 
    int count = c.getCount(); 
    String[] data_me = new String[count]; 
    for (int i = 0; i < count; i++) { 
     c.moveToNext(); 
     data_me[i] = c.getString(0); 

    } 
    c.close(); 
    db.close(); 

    AlarmManager[] alarmManager = new AlarmManager[24]; 
    for (int ii = 0; ii < data_me.length; ii++) { 


     alarmManager[ii] = (AlarmManager) getSystemService(ALARM_SERVICE); 
     Intent i = new Intent(getBaseContext(), MyReceiver.class); 

     PendingIntent displayIntent = PendingIntent.getBroadcast(getBaseContext(), ii, i, 0); 
     alarmManager[ii].set(AlarmManager.RTC_WAKEUP, calender.getTimeInMillis(), displayIntent); 


    } 
} 

}

Pls는가, 누군가가 나를 도와 수 있습니까?

답변

0

이것은 좋은 시작입니다. 게시 한 내용에 따라 방송 수신기가 시작된 후에 만 ​​서비스가 시작됩니다.이 경우 장치가 부팅 된 후입니다. Android 6 (Marshmallow) 이전에는 재부팅 후 작업을 처리하기에 충분했습니다. 이 의도는 대개 재부팅을 처리하는 것처럼 충분하지 않습니다. Android 6을 실행하는 기기를 사용하고 있습니까? 그렇다면 Android 5 이하를 실행하는 개발 환경에서이 Android 5 이하를 실행하는 기기에서 코드가 작동하는지 확인하기위한 시뮬레이션 장치를 만들 수 있습니다. Android 6 이상을 실행하는 기기를 지원한다고 가정하면 수신자가 처리 할 다른 의도를 선택해야합니다.

AlarmManager를 처리하려면 : 죄송합니다. Alarmmanager의 set 메소드는 데이터베이스에서 날짜와 시간을 검색하기 전에 작성한 캘린더 객체를 사용합니다. 따라서 AlarmManager를 설정하기 위해 사용하면 저장된 날짜와 시간 FRM 대신 데이터 탭으로 이동합니다. 검색된 날짜를 저장하기 위해 일정 배열 또는 배열 목록을 만든 다음 그 배열을 반복하여 AlarmManager를 설정할 수 있습니다.

sqlite 삽입을 방지하기 위해 rawQuery 대신 query 메소드를 사용하는 것이 안전합니다.

편집의 당신의 코드를 살펴 보겠습니다 : 당신은 사용자가 시간 및/또는 날짜를 설정해야할까요, 특별히 서비스를 개시 할 다른 방법이 있나요

@Override 
public IBinder onBind(Intent intent) { 
     return null; 
} 

@Override 
public void onCreate() { 
    super.onCreate(); 
    Calendar calender = Calendar.getInstance(); 
    calender.clear(); //WHY CLEAR CALENDAR? LATER YOU USE IT TO SET THE ALARMMANAGER. 
    SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy"); 
    SimpleDateFormat formatt = new SimpleDateFormat("hh:mm"); 

    CharSequence text = format.format(new Date()); 
    ; //REMOVE SEMI-COLON 
    CharSequence time = formatt.format(new Date()); 
    ; //REMOVE SEMI-COLON 
    String sql = String.format("SELECT * FROM comments_table WHERE time = '" + String.valueOf(time) + "'" + "and date = '%s'", String.valueOf(text) + ""); 
    /*WHAT ARE YOU SELECTING FROM THE DB? 
    *YOU ARE ALREADY USING THE CURRENT TIME AS A PARAMETER; ASSUMEDLY, 
    *YOU'RE NOT RETRIEVING THE DATE AND TIME*/ 

    Cursor c = db.rawQuery(sql, null); //WHERE IS YOUR db INITIALIZED & OPENED? ADD APPROPRIATE CODE **BEFORE** MAKING THIS QUERY 
    int count = c.getCount(); 
    String[] data_me = new String[count]; 
    for (int i = 0; i < count; i++) { 
     c.moveToNext(); 
     data_me[i] = c.getString(0); 

    } 
    c.close(); 
    db.close(); 

    AlarmManager[] alarmManager = new AlarmManager[24]; 
    for (int ii = 0; ii < data_me.length; ii++) { 


     alarmManager[ii] = (AlarmManager) getSystemService(ALARM_SERVICE); 
     Intent i = new Intent(getBaseContext(), MyReceiver.class); 

     PendingIntent displayIntent = PendingIntent.getBroadcast(getBaseContext(), ii, i, 0); 
     alarmManager[ii].set(AlarmManager.RTC_WAKEUP, calender.getTimeInMillis(), displayIntent); 

     } 
    } 
} 

(사용 예를 들어 TimePicker)를 실행할 수 있습니까? 이 경우 BroadcastReceiver에 인 텐트를 수신 한 다음 재부팅 한 것처럼 지금 전화를 겁니다. 사실 현재 Receiver 클래스에 인 텐트를 추가하여 이러한 인 텐트를 처리 할 수 ​​있습니다. 해당 인 텐트 필터가 매니페스트 파일에 있는지 확인하십시오.

쿼리에서 날짜/시간을 검색하여이를 사용하여 AlarmManager를 설정하려는 경우 Calendar 객체에 요일/시간을 저장하고 Calendar ArrayList에 배치하여 루프를 반복 할 수 있습니다 AlarmManager를 설정할 때.

+0

도움 주셔서 감사합니다. – ssshehu

+0

편집 된 답변을 참조하십시오. – Schreiby

+0

편집 된 답변을 참조하십시오. – Schreiby

관련 문제