当用户在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);
以上代码在后台耗尽我的移动电池中运行, 但我需要当用户启动应用程序时,服务应该运行一次一天。如何实现这一目标。
答案 0 :(得分:7)
AlarmManager
只是可以100%唤醒设备的功能。
如果没有做任何工作,任何服务都不会消耗你的电池。我认为你必须更仔细地阅读你的代码。
尽管如此,一些建议。 您可以呼叫广播接收器而不是服务来唤醒。 也就是说,使用
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>
你的代码非常糟糕:
哦,这到底是什么意思?Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
long t = calendar.getTimeInMillis();
我想你必须阅读你的代码。
答案 1 :(得分:3)
我使用Shared pref找到了我的问题的答案。
当活动开始时,将在一天中第一次运行异步任务。然后在Post执行今天的日期保存。
之后async将不会在同一天执行。 我删除了警报管理器部分
// 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";
在Oncreate活动中
/* 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.");
}
内部异步任务在执行后
@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();
}
}
答案 2 :(得分:-1)
如果您还想让设备保持唤醒状态或唤醒服务设备,请使用this。
为了在应用程序启动时每天运行一次很容易,只需在任务完成时使用SharedPreferences进行存储,这样当用户再次打开任务时,简单检查SharedPrefs应该会阻止相同的任务从再次运行。