我是否正确使用警报?
问题描述:
我有一个android应用程序,它会记录每x分钟的数据。闹钟响起的时间取决于设置页面(10或30分钟)。当警报进入初始屏幕时,警报首先被激活。我的问题是,当我在手机上使用它时似乎没有被调用,所以我希望有人能告诉我,如果我正确使用该功能。如果我是否正确使用警报?
if (prefs.getBoolean("backgroundupdates", true)) {
Intent setAlarm = new Intent(Splash.this,
UpdateLocation.class);
PendingIntent pendingIntent = PendingIntent.getService(
Splash.this, 0, setAlarm, 0);
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
Calendar calendar = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat(
"yyyy-MM-dd hh:mm:ssaa");
History.addHistory(sdf.format(calendar.getTime()), "App Started", "");
calendar.setTimeInMillis(System.currentTimeMillis());
int UPDATE_TIME = prefs.getInt("Update_time", 30);
calendar.add(Calendar.MINUTE, UPDATE_TIME);
alarmManager.set(AlarmManager.RTC_WAKEUP,
calendar.getTimeInMillis(), pendingIntent);
}
此背景检查更新并设置一个报警UPDATE_TIME分钟(默认30)
在我UpdateLocation.class我有这样的在底部
Intent setAlarm = new Intent(UpdateLocation.this,
UpdateLocation.class);
PendingIntent pendingIntent = PendingIntent.getService(
UpdateLocation.this, 0, setAlarm, 0);
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
int UPDATE_TIME = prefs.getInt("Update_time", 30);
calendar.add(Calendar.MINUTE, UPDATE_TIME);
alarmManager.set(AlarmManager.RTC_WAKEUP,
calendar.getTimeInMillis(), pendingIntent);
这是如此该警报将在UPDATE_TIME分钟中再次自行调用。我这样做的原因是因为UPDATE_TIME可能会改变(取决于用户的喜好)
谢谢!这里
编辑是我UpdateLocation.class
public class UpdateLocation extends IntentService {
public static final String id = "";
public UpdateLocation() {
super("UpdateLocation");
}
@Override
protected void onHandleIntent(Intent intent) {
SharedPreferences prefs = getSharedPreferences("Settings", 0);
final String id = prefs.getString("ID", "");
if (prefs.getBoolean("backgroundupdates", true)) {
HttpParams httpParams = new BasicHttpParams();
// 30seconds and it stops
HttpConnectionParams.setConnectionTimeout(httpParams, 30000);
HttpConnectionParams.setSoTimeout(httpParams, 30000);
DefaultHttpClient httpclient = new DefaultHttpClient(httpParams);
HttpPost httpost = new HttpPost(
"http://iphone-radar.com/gps/gps_locations");
JSONObject holder = new JSONObject();
try {
holder.put("id", id);
LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_FINE);
String bestProvider = locationManager.getBestProvider(criteria,
false);
LocationListener loc_listener = new LocationListener() {
@Override
public void onStatusChanged(String provider, int status,
Bundle extras) {
// TODO Auto-generated method stub
}
@Override
public void onProviderEnabled(String provider) {
// TODO Auto-generated method stub
}
@Override
public void onProviderDisabled(String provider) {
// TODO Auto-generated method stub
}
@Override
public void onLocationChanged(Location location) {
// TODO Auto-generated method stub
}
};
try {
Looper.prepare();
locationManager.requestLocationUpdates(bestProvider, 0, 0,
loc_listener);
} catch (Exception e) {
e.printStackTrace();
}
Location location = locationManager
.getLastKnownLocation(bestProvider);
Calendar c = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat(
"hh:mmaa MM/dd/yyyy");
holder.put("time", sdf.format(c.getTime()));
holder.put("time_since_epoch", System.currentTimeMillis()/1000);
try {
holder.put("lat", location.getLatitude());
holder.put("lon", location.getLongitude());
} catch (NullPointerException e) {
try {
holder.put("lat", -1.0);
holder.put("lon", -1.0);
} catch (JSONException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
StringEntity se = new StringEntity(holder.toString());
httpost.setEntity(se);
httpost.setHeader("Accept", "application/json");
httpost.setHeader("Content-type", "application/json");
ResponseHandler responseHandler = new BasicResponseHandler();
String response = httpclient.execute(httpost, responseHandler);
org.json.JSONObject obj;
SimpleDateFormat sdf2 = new SimpleDateFormat(
"yyyy-MM-dd hh:mm:ssaa");
try{
History.addHistory(sdf2.format(c.getTime()), "GPS",
"Latitude: " + location.getLatitude() + "\n"
+ "Longitude: " + location.getLongitude());}
catch(NullPointerException e){
History.addHistory(sdf2.format(c.getTime()), "GPS",
"Latitude: " + "No Signal" + "\n"
+ "Longitude: " + "No Signal");
}
obj = new org.json.JSONObject(response);
Intent setAlarm = new Intent(UpdateLocation.this,
UpdateLocation.class);
PendingIntent pendingIntent = PendingIntent.getService(
UpdateLocation.this, 0, setAlarm, 0);
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
int UPDATE_TIME = prefs.getInt("Update_time", 30);
calendar.add(Calendar.MINUTE, UPDATE_TIME);
alarmManager.set(AlarmManager.RTC_WAKEUP,
calendar.getTimeInMillis(), pendingIntent);
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
注意,我没有广播接收器,我不太知道如何使用它,因此任何例子将是非常有益的。
答
你可能会发布所有的UpdateLocation.class?它需要延长BroadcastReceiver
,以便可能是您的问题所在。
至于你的闹钟,如果它被设置为每隔xx分钟没有结束时关闭,你最好使用alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), UPDATE_TIME * 60000, pendingIntent);
定期重置闹钟。
编辑1
关于把的PendingIntent成方便地访问静态函数,它可以去是这样的:
public static PendingIntent getPendingIntent(int update_time) {
Intent setAlarm = new Intent(this.getBaseContext(), UpdateLocation.class);
PendingIntent pendingIntent = PendingIntent.getService(this.getBaseContext(),
0, setAlarm, 0)
return pendingIntent;
}
然后你就可以用alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), UPDATE_TIME * 60000, MyClass.getPendingIntent());
让你的闹钟
我现在就更新它。 setRepeating方法是否每次重复检查UPDATE_TIME?因为用户可以随时更改UPDATE_TIME的值。 –
它的重复值保持不变,但可以随时更新。调用'alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,calendar.getTimeInMillis(),UPDATE_TIME * 60000,pendingIntent);'具有相同的PendingIntent将自动取消现有的警报并重新添加新的时间延迟。 –
至于BroadcastReceiver,我使用[本教程](http://justcallmebrian.com/?p=129)来帮助我。请记住在Android Manifest中添加额外的' '标签。 –