设备重启警报在特定时间没有关闭

时间:2011-11-09 09:50:41

标签: android android-alarms

我是android的新手。我在android中开发报警应用程序。我已经完成了以下代码,这些代码在设备启动时可以正常工作,但在设备重启时它将无法正常工作。我将该警报存储在共享首选项中并从中检索。设备重启时,我从 OnBootReceiver 重新安排闹钟。我已经提到了Android-manifest的权限。为了测试目的,我采用了硬编码值。请检查以下代码并帮助我从一天半开始研究它。任何人都有想法。谢谢。

公共类FirstActivity扩展了Activity实现OnClickListener {

  int mHour = 14;
  int mMinute = 48;
  static String prefkey="SHARED_KEY";

public void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   setContentView(R.layout.main);
   SharedPreferences preferences  =getSharedPreferences(prefkey,Context.MODE_WORLD_READABLE);


        SharedPreferences.Editor editor = preferences.edit();
        editor.putInt("min",mMinute);
        editor.putInt("hour",mHour);
        editor.commit();
   }
}

公共类OnBootReciever扩展了BroadcastReceiver {

    int sethour,setmin;
@Override
public void onReceive(Context context, Intent intent) {

    Toast.makeText(context, "booting....", Toast.LENGTH_LONG).show();
    SharedPreferences preferences=context.getSharedPreferences(FirstActivity.prefkey,Context.MODE_PRIVATE);
    sethour=preferences.getInt("hour",14);
    setmin=preferences.getInt("min",48);
    Calendar cal=Calendar.getInstance();
    cal.add(Calendar.MINUTE,setmin);
    cal.add(Calendar.HOUR_OF_DAY,sethour);
    cal.add(Calendar.SECOND,0);


    AlarmManager mgr=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
    Intent i=new Intent(context,RepeatingAlarm.class);

    PendingIntent sender1 = PendingIntent.getBroadcast(context,0, i,PendingIntent.FLAG_UPDATE_CURRENT);

    mgr.setRepeating(AlarmManager.RTC_WAKEUP,cal.getTimeInMillis(),AlarmManager.INTERVAL_FIFTEEN_MINUTES,sender1);

}

}

公共类RepeatingAlarm扩展BroadcastReceiver {

   static MediaPlayer mMediaPlayer ;

@Override
public void onReceive(Context context, Intent intent) {
    Toast.makeText(context, "Trigger the alarm", Toast.LENGTH_LONG).show();
    mMediaPlayer = new MediaPlayer();
   mMediaPlayer.create(getcontext,R.raw.warm).start();
   }

}

AndroidManifest.xml - >

 <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
 <receiver android:name="com.vidushi.alarmsystem.RepeatingAlarm"></receiver>
        <receiver android:name=".OnBootReciever" android:process=":remote">
            <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
            <category android:name="android.intent.category.HOME" />
            </intent-filter>
         </receiver>

2 个答案:

答案 0 :(得分:1)

当android调用你的OnBootReceiver类时,它会传递它自己的上下文,而不是你的应用程序的上下文。因此它无法找到共享首选项,因为android没有它们。尝试使用您自己的上下文而不是onReceive方法中的上下文。您可以像这样使用Application创建context类,并在应用程序启动时初始化它:

import android.content.Context;

public class Application extends android.app.Application {

    private static Context context;

    public void onCreate(){
        context=getApplicationContext();
    }

    public static Context getContext() {
        return context;
    }

}

您还需要在AndroidManifest.xml中为标记添加以下属性:

android:name=".Application"

Link

然后使用Application获取共享偏好设置:

Context context = Application.getContext();
SharedPreferences preferences=context.getSharedPreferences(FirstActivity.prefkey,Context.MODE_PRIVATE);

答案 1 :(得分:0)

您的应用是否安装在SD卡上?如果是,它将不会收到“启动完成”通知。

请参阅App Install Location