我创建了简单的服务,每隔一秒就要记录一次。我使用了警报管理器(因为来自official document说Note: The Alarm Manager is intended for cases where you want to have your application code run at a specific time, even if your application is not currently running.
)但它随机重复。
这是我的代码
MainActiviry.class
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
if (fab != null) {
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(MainActivity.this,LogService.class);
startService(intent);
}
});
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
点击FAB按钮开始服务。
LogService.class
public class LogService extends Service {
private static final String TAG = LogService.class.getSimpleName();
public LogService() {
super();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.e(TAG, "onStartCommand: Service calling" );
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
super.onDestroy();
}
@Override
public void onCreate() {
Timer(this);
super.onCreate();
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
private void Timer(Context context){
Intent intent = new Intent(context,LogService.class);
PendingIntent pendingIntent = PendingIntent.getService(context,0,intent,0);
AlarmManager alarmManager = (AlarmManager) getApplicationContext().getSystemService(getApplicationContext().ALARM_SERVICE);
alarmManager.setRepeating(alarmManager.RTC_WAKEUP,System.currentTimeMillis(),1*1000,pendingIntent);
}
}
这是我的 LOG
它每分钟都在重复,但我每秒钟都在写。我犯了什么错吗?
答案 0 :(得分:0)
由于API 19重复警报不准确。见:
注意:从API 19开始,所有重复警报都不准确。如果您的应用程序需要精确的交付时间,那么它必须使用一次性精确警报,每次重新安排如上所述。 targetSdkVersion早于API 19的旧应用程序将继续将所有警报(包括重复警报)视为完全警报。
您必须将targetSdkVersion
设置为低于19的值或使用一次性精确警报并每次重新设置它们。
使用java.util.Timer
Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
//Put your code here
Log.d("Log", "Hello World");
}
}, 0, 1000);