2016-03-29 3 views
0

Почему мои аварийные сигналы не звонят после перезапуска устройства? Я вставляю свои времена тревоги в базу данных SQLite и снова устанавливаю аварийные сигналы после перезапуска устройства, но это, похоже, не работает. Что я могу сделать, чтобы зазвонить мои сигналы одновременно? mySQLiteHelper.class:Установить аварийные сигналы после перезапуска устройства

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; 
    } 
} 

И 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; 
    } 
} 

Это как я называю 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")); 

И 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); 
     } 
    } 
} 

А также мой 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> 

спасибо.

+0

Ваш приемник работает вообще? У вас есть разрешение «RECEIVE_BOOT_COMPLETED» в манифесте? –

+0

поделиться своим файлом манифеста –

+0

вы также добавили это?

ответ

0

Вам нужно сделать следующее.

добавить следующее решение.

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

удалить конструктор из ресивера.

Но если моя будет сохранена на SD-карте, я должен добавить разрешение READ_EXTERNAL_STORAGE?

Если вы хотите прочитать данные с SD-карты, вам необходимо указать это разрешение. если вы хотите писать данные только на SD-карте, тогда нет необходимости в этом. в этом случае вам необходимо WRITE_EXTERNAL_STORAGE разрешение

0

В случае андроида, если ваше устройство перезагружено, все службы/получатели, не имеющие разрешения BOOT_COMPLETED в файле манифеста, не будут перезагружены. Поскольку приемники и службы теперь «умерли» после перезагрузки, никто не может прослушивать ваши «ожидающие намерения» для сигналов тревоги, никто не может отправить новое ожидающее намерения, и, кроме того, после перезапуска эти ожидающие намерения также очищаются. , используйте это разрешение в манифесте и обрабатывайте намерение перезапуска в своем приемнике.

+0

может кто-то объяснить, что я написал здесь неправильно, так что я получил нижестоящий голос, так как тогда я хотел бы получить мои знания правильно, читая в правильном направлении. –

+0

Возможно, это потому, что 'BOOT_COMPLETED' является широковещательным действием. Разрешение: «RECEIVE_BOOT_COMPLETED». Или, может быть, это потому, что ваш ответ - это просто догадка в этот момент. Мы не знаем, имеет ли OP это разрешение уже или нет. Некоторым пользователям это не нравится, когда вы публикуете догадки в качестве ответов. –

+0

Ahh спасибо. Кажется, я забыл правильное имя разрешения. –

Смежные вопросы