我是否正确使用警报?

问题描述:

我有一个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());让你的闹钟

+0

我现在就更新它。 setRepeating方法是否每次重复检查UPDATE_TIME?因为用户可以随时更改UPDATE_TIME的值。 –

+0

它的重复值保持不变,但可以随时更新。调用'alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,calendar.getTimeInMillis(),UPDATE_TIME * 60000,pendingIntent);'具有相同的PendingIntent将自动取消现有的警报并重新添加新的时间延迟。 –

+0

至于BroadcastReceiver,我使用[本教程](http://justcallmebrian.com/?p=129)来帮助我。请记住在Android Manifest中添加额外的''标签。 –