2017-09-12 11 views
-2

私はアンドロイド開発には初めてです。私はsqlite dbからアラームを設定し、時刻と日付にアラームを取得したい。私はBroadcastReceiverクラスを拡張してサービスを拡張することを使用して動作することを確認するために最善を尽くしましたが、私はcouldntです。ここでBroadcastReceiverブロードキャストクラスとサービスクラスを使用するSQLite、Alarm Manager

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を設定すると、保存された日付と時刻の代わりにデータタブが表示されます。カレンダー配列または配列リストを作成して検索した日付を格納し、それをループしてAlarmManagerを設定することができます。

さらに、sqliteの挿入を防ぐためにrawQueryの代わりにqueryメソッドを使用する方が安全です。

EDITのは、あなたのコードを見てみましょう:あなたは、ユーザーが時間および/または日付を設定していたいです、あなたは具体的には、サービスを開始したい別の方法があります

@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オブジェクトに日時を格納し、それをカレンダーArrayListに配置してループさせますAlarmManagerを設定するときに使用します。

+0

ありがとうございます。 – ssshehu

+0

編集された回答をご覧ください。 – Schreiby

+0

編集された回答をご覧ください。 – Schreiby

関連する問題