2016-03-29 7 views
0

Warum klingeln meine Alarme nach dem Neustart des Geräts nicht? Ich füge die Zeiten meiner Alarme in die SQLite-Datenbank ein und setze die Alarme nach dem Neustart des Geräts erneut, aber das scheint nicht funktioniert zu haben. Was kann ich tun, damit meine Alarme gleichzeitig klingeln? mySQLiteHelper.class:Alarme nach dem Neustart des Geräts einstellen

public class mySQLiteHelper extends SQLiteOpenHelper { 
    // All Static variables 
    // Database Version 
    public static final int DATABASE_VERSION = 2; 

    // Database Name 
    private static final String DATABASE_NAME = "alarms.db"; 

    // Contacts table name 
    private static final String TABLE_ALARMS = "alarms"; 

    // Contacts Table Columns names 
    private static final String KEY_ID = "id"; 
    private static final String KEY_ALARM = "alarm"; 
    private static final String KEY_NAME = "name"; 

    public mySQLiteHelper(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    } 

    // Creating Tables"create table alarms (" 
    //+ "id integer primary key," 
     //  + "alarm text," 
     // + "name text," // added a ',' 
      // + "alarmname text" + ");" 
    @Override 
    public void onCreate(SQLiteDatabase db) { 
     String CREATE_CONTACTS_TABLE = "CREATE TABLE " + TABLE_ALARMS + "(" 
       + KEY_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + KEY_ALARM + " TEXT, " 
       + KEY_NAME + " TEXT" + ")"; 
     //String CREATE_CONTACTS_TABLE = "CREATE TABLE " + TABLE_ALARMS + "(" 
      //  + KEY_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + KEY_ALARM + " TEXT, " 
      //  + KEY_NAME + " TEXT, UNIQUE ("+KEY_NAME+") ON CONFLICT REPLACE" + ")"; 
     db.execSQL(CREATE_CONTACTS_TABLE); 
    } 

    // Upgrading database 
    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     // Drop older table if existed 
     db.execSQL("DROP TABLE IF EXISTS " + TABLE_ALARMS); 

     // Create tables again 
     onCreate(db); 
    } 

    /** 
    * All CRUD(Create, Read, Update, Delete) Operations"," + alarm.getName() +,name 
    */ 

    // Adding new contact 
    void addAlarm(Alarm alarm) { 
     SQLiteDatabase db = this.getWritableDatabase(); 
     String sql = 
       "INSERT or replace " + 
         "INTO alarms (alarm,"+KEY_NAME+") " + 
         "VALUES("+ alarm.getAlarm() + ",'" + alarm.getName() + "')"; 
     //String sql = 
      //  "INSERT or replace INTO alarms (alarm,alarmname) VALUES("+ alarm.getAlarm() + ",'" + alarm.getName() + "')" ; 
     db.execSQL(sql); 
     db.close(); // Closing database connection 
    } 

    // Getting single contact 
    String getAlarm(String alarmname) { 
     String query = "Select * FROM " + TABLE_ALARMS + " WHERE " + KEY_NAME + " = \"" + alarmname + "\""; 
     SQLiteDatabase db = this.getReadableDatabase(); 
     Cursor cursor = db.rawQuery(query, null); 
     if (cursor.getCount()>0) 
      cursor.moveToFirst(); 
     String alarm = cursor.getString(cursor.getColumnIndex(KEY_ALARM)); 
     cursor.close(); 
     // return contact 
     return alarm; 
    } 

    // Deleting single contact 
    public void deleteAlarm() { 
     SQLiteDatabase db = this.getWritableDatabase(); 
     //db.delete(TABLE_ALARMS, KEY_ID + " = ?",Alarm alarm 
      //  new String[] { String.valueOf(alarm.getID()) }); 
     db.execSQL("delete from " + TABLE_ALARMS); 
     db.close(); 
    } 


    // Getting contacts Count 
    public int getAlarmsCount() { 
     String countQuery = "SELECT * FROM " + TABLE_ALARMS; 
     SQLiteDatabase db = this.getReadableDatabase(); 
     Cursor cursor = db.rawQuery(countQuery, null); 
     int i = cursor.getCount(); 
     cursor.close(); 

     // return count 
     return i; 
    } 
} 

Und Alarm.class:

public class Alarm { 
    //private variables 
    int _id; 
    String _name; 
    String _alarm; 

    // Empty constructor 
    public Alarm(String alarm,String alarmname){ 
     this._alarm = alarm; 
     this._name = alarmname; 
    } 
    // constructor 
    public Alarm(int id, String name, String alarm){ 
     this._id = id; 
     this._name = name; 
     this._alarm = alarm; 
    } 

    // constructor 
    public Alarm(String alarm){ 
     this._alarm = alarm; 
    } 
    // getting ID 
    public int getID(){ 
     return this._id; 
    } 

    // getting name 
    public String getName(){ 
     return this._name; 
    } 

    // getting phone number 
    public String getAlarm(){ 
     return this._alarm; 
    } 
} 

Dies ist, wie ich nenne addAlarm():

Calendar calendar1 = Calendar.getInstance(); 
       calendar1.set(Calendar.MINUTE, timePicker1.getCurrentMinute()); 
       calendar1.set(Calendar.HOUR_OF_DAY,timePicker1.getCurrentHour()); 

       String alarm1 = Long.toString(calendar1.getTimeInMillis()); 
       mySQLiteHelper mySQLiteHelper = new mySQLiteHelper(MainActivity2.this); 
       mySQLiteHelper.deleteAlarm(); 
       mySQLiteHelper.addAlarm(new Alarm(alarm1,"alarm1")); 

Und MyReceiver2.class:

public class MyReceiver2 extends BroadcastReceiver { 
    public MyReceiver2() { 
    } 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)){ 
      //context.startService(new Intent(context, MyService.class)); 
      AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
      Intent intent1 = new Intent(context,StartReceiver.class); 
      PendingIntent pi = PendingIntent.getBroadcast(context,0,intent1,0); 
      mySQLiteHelper mySQLiteHelper = new mySQLiteHelper(context); 
      String alarm1 = mySQLiteHelper.getAlarm("alarm1"); 
      long alarm2 = Long.parseLong(alarm1); 
       am.set(AlarmManager.RTC,alarm3,pi); 
     } 
    } 
} 

Und auch mein AndroidManif est

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="com.example.amadey.myapplication" > 

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> 

<application 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher1" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme" > 
    <activity 
     android:name=".Introduction" 
     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=".MainActivity" 
     android:theme="@style/AppTheme" > 
    </activity> 
    <activity 
     android:name=".MainActivity2" 
     android:theme="@style/AppTheme" > 
    </activity> 

    <receiver 
     android:name=".StartReceiver" 
     android:enabled="true" 
     android:exported="true" > 
    </receiver> 

    <service 
     android:name=".MyService" 
     android:enabled="true" 
     android:exported="true" > 
    </service> 

    <receiver 
     android:name=".MyReceiver" 
     android:enabled="true" 
     android:exported="true" > 

    </receiver> 

    <service 
     android:name=".MyService2" 
     android:enabled="true" 
     android:exported="true" > 
    </service> 

    <receiver 
     android:name=".MyReceiver2" 
     android:enabled="true" 
     android:exported="true" > 
     <intent-filter> 
     <action android:name="android.intent.action.BOOT_COMPLETED" /> 
    </intent-filter> 
    </receiver> 
</application> 

</manifest> 

Vielen Dank.

+0

Funktioniert Ihr Empfänger überhaupt? Haben Sie die Berechtigung "RECEIVE_BOOT_COMPLETED" im Manifest? –

+0

teilen Sie Ihre Manifest-Datei –

+0

haben Sie das auch hinzugefügt?

Antwort

0

Sie müssen die folgenden Dinge tun.

fügen Sie die folgende Erlaubnis hinzu.

<uses-permission android:name="android.permission.READ_PHONE_STATE" /> 

des Konstruktors von dem Empfänger entfernen.

Aber wenn ich auf der SD-Karte gespeichert werde, sollte ich READ_EXTERNAL_STORAGE Erlaubnis hinzufügen?

Wenn Sie Daten von der SD-Karte lesen möchten, müssen Sie diese Berechtigung angeben. Wenn Sie nur Daten auf SD-Karte schreiben wollen, brauchen Sie das nicht. In diesem Fall benötigen Sie WRITE_EXTERNAL_STORAGE Erlaubnis

0

Da in Android, wenn Ihr Gerät neu gestartet wird, werden alle Dienste/Empfänger, die keine BOOT_COMPLETED-Berechtigung in der Manifestdatei haben, nicht neu gestartet. Da die Empfänger und Dienste nach dem Neustart nun "abgestorben" sind, gibt es niemanden, der Ihre "ausstehenden Absichten" auf Alarme hört, niemand, der eine neue ausstehende Absicht sendet, und außerdem werden diese ausstehenden Absichten beim Neustart ebenfalls gelöscht. Kurz gesagt, verwenden Sie diese Berechtigung in Manifest und behandeln Sie die Neustart-Absicht in Ihrem Empfänger.

+0

kann mir jemand erklären, was ich hier falsch geschrieben habe, dass ich einen Downvote bekommen habe, denn dann möchte ich mein Wissen korrigieren, indem ich in die richtige Richtung lese. –

+0

Es könnte sein, weil 'BOOT_COMPLETED' die Broadcast-Aktion ist. Die Berechtigung ist 'RECEIVE_BOOT_COMPLETED'. Oder vielleicht liegt es daran, dass Ihre Antwort zu diesem Zeitpunkt nur eine Vermutung ist. Wir wissen nicht, ob das OP diese Erlaubnis bereits hat oder nicht. Einige Benutzer mögen es nicht, wenn Sie Vermutungen als Antworten posten. –

+0

Ahh danke. Es scheint, dass ich den richtigen Namen der Erlaubnis vergessen habe. –

Verwandte Themen