调用服务类一天一次的应用程序在Android中启动,电池消耗较less

当用户每天在Android中启动一次应用程序时,我想调用服务类。

清单代码:

<service android:name=".DailyRemainder" > <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> </intent-filter> </service> 

Java代码:

  // for Repeating Process Intent myIntent = new Intent(sign_in.this,.DailyRemainder.class); pendingIntent1 = PendingIntent.getService(sign_in.this, 0,myIntent, 0); AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(System.currentTimeMillis()); calendar.add(Calendar.SECOND, 20); alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent1); alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 24*60*60*1000, pendingIntent1); 

上面的代码是在后台运行我的手机电池 ,但我需要当用户启动应用程序,时间服务应该在一天运行一次 。 如何实现这一点。

Solutions Collecting From Web of "调用服务类一天一次的应用程序在Android中启动,电池消耗较less"

AlarmManager只是可以唤醒您的设备100%的function。

如果没有任何工作,任何服务都不会消耗您的电池。 我认为你必须更仔细地阅读你的代码。

尽pipe如此,一些build议。 您可以调用广播接收器而不是服务来唤醒。 那就是使用

 Intent intent = new Intent("yourBroadCastString"); PendingIntent pi = PendingIntent.getBroadcast(...); int currentapiVersion = android.os.Build.VERSION.SDK_INT; if (currentapiVersion >= android.os.Build.VERSION_CODES.KITKAT){ am.setExact(wakeup?AlarmManager.RTC_WAKEUP:AlarmManager.RTC, nexttime, pi); } else{ am.set(wakeup?AlarmManager.RTC_WAKEUP:AlarmManager.RTC, nexttime, pi); } 

在上面的情况am.setExact可以真正消耗电池,

唤醒你的设备在这种情况下,你必须使用里面的广播:

 PowerManager pm = (PowerManager) ctx.getSystemService(Context.POWER_SERVICE); wakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP | PowerManager.ON_AFTER_RELEASE, _.APPNAME + Integer.toString(index)); if (wakeLock != null && wakeLock.isHeld()){ wakeLock.acquire(); } ComponentName comp = new ComponentName(ctx.getPackageName(), yourServiceClass.class.getName()); startWakefulService(ctx, intent.setComponent(comp)); 

androidmanifest.xml里面

 <receiver android:name="yourBroadCast"> <intent-filter> <action android:name="yourBroadCastString"/> </intent-filter> </receiver> 

而你的代码真的很糟糕:

Omg,这到底是什么? Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(System.currentTimeMillis()); long t = calendar.getTimeInMillis(); 我认为你必须阅读你的代码。

我find了我的问题使用共享前缀的答案。

活动启动时,一天中的第一次asynchronous任务将运行。 然后在Post执行今天的date被保存。

之后asynchronous不会在同一天执行。 我删除了报警pipe理器部分

 // Shared Preferences SharedPreferences settingsShrepref; // Editor for Shared preferences SharedPreferences.Editor editor; // Sharedpref file name private static final String PREF_NAME = "MyPrefFileShred"; // User name (make variable public to access from outside) public static final String KEY_TODAY_DATE_ANDTIME = "TimeToday"; 

内部创build活动

  /* Added Servcie count Once in a day Fetch from Server*/ try { DateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy"); Date date = new Date(); TodayDate_String = dateFormat.format(date); settingsShrepref = getSharedPreferences(PREF_NAME, 0); editor = settingsShrepref.edit(); String Val=settingsShrepref.getString(KEY_TODAY_DATE_ANDTIME,""); Log.i("Stored Val", Val); Log.i("Today date", TodayDate_String); if(!Val.equals(TodayDate_String)) { //for SYNC web to Local try { Log.d("Comments", "FirstTime Started"); // get Internet status isInternetPresent = cd1.isConnectingToInternet(); // check for Internet status if (isInternetPresent) { new AsyncCallWSCategoryCOUNTFetch().execute(); } else { Log.i("CATEGORY COUNT ", "Not Internet ......!"); } } catch (Exception e) { e.printStackTrace(); Log.i(" CATEGORY COUNT ", "EXCEPTION in reading Data from Web Async task ONstart ......!"); } } else { Log.d("Comments", "Second TIme"); Getmethod(); } } catch (Exception e) { e.printStackTrace(); Log.i("", "Exception here Run Service."); } 

内部asynchronous任务在执行后

 @Override protected void onPostExecute(Void result) { Log.i(TAG_CategoryCOUNT, "onPostExecute"); try { //the app is being launched for first time in a Day, do something Log.d("Comments", "First Time"); // Storing name in pref editor.putString(KEY_TODAY_DATE_ANDTIME, TodayDate_String); // commit changes editor.commit(); String Val=settingsShrepref.getString(KEY_TODAY_DATE_ANDTIME, null); Log.d("after Insertion data Date", Val); } catch (Exception e) { e.printStackTrace(); } } 

如果您还想让设备保持唤醒或唤醒设备进行维修,请使用此设置 。

每天运行一次应用程序启动时很容易,只需使用SharedPreferences存储任务完成时间,以便当用户再次打开任务时,在SharedPrefs中进行一次简单的检查就可以防止同一个任务运行再次。