![](/img/trans.png)
[英]Android: time intervals with deep sleep (System.nanoTime(), System.currentTimeMillis(), SystemClock.elapsedRealtimeNanos())
[英]SystemClock freezes the system
在View類中,我重寫onFinishInflate()
來調用setupEventHandlers()
,它定義了一些偵聽器。 例如:
setDate.setOnClickListener( new OnSingleClick() {
@Override
public void onSingleClick( final View v ) {
controller.onSetDate();
}
}
} );
在controller.onSetDate()
我有以下命令:
SystemClock.setCurrentTimeMillis(dateTime.getMillis());
( dateTime
是一個DateTime
對象)
調用此方法后,系統會凍結。 聽眾停止工作。 單擊附加的按鈕沒有任何反應(也在調試模式下檢查-單擊按鈕時它不會進入偵聽器)。 只有逼人退 (Android設備本身)的作品,然后系統再次恢復正常(它識別聽眾)。
為什么會這樣呢?
編輯:
我在有根設備上工作,並且所有權限都已設置。
現在我的代碼如下:
AlarmManager alarm = (AlarmManager) MainApplication.getAppContext().getSystemService( Context.ALARM_SERVICE );
long time = dateTime.getMillis();
DateTimeZone zone = dateTime.getZone();
alarm.setTime( time );
alarm.setTimeZone( zone.toTimeZone().getID() );
TimeZone.setDefault( zone.toTimeZone() );
DateTimeZone.setDefault( zone );
僅當我嘗試向后設置時間/日期時,才會出現問題。 將其向前設置很好。
有關SystemClock.setCurrentTimeMillis
的Javadoc指示您的應用程序必須具有適當的權限 。 快速瀏覽一下代碼,發現SystemClock.setCurrentTimeMillis
最終正在調用AlarmManager.setTime
,它需要以下權限:android.permission.SET_TIME
您應該在清單中添加權限:
<uses-permission android:name="android.permission.SET_TIME"/>
請注意,這是系統級別的權限,因此您的應用必須使用適當的簽名(系統)進行簽名,否則不會授予該權限。
您可以使用以下命令檢查是否授予了權限:
String permission = "android.permission.SET_TIME";
int res = context.checkCallingOrSelfPermission(permission);
boolean permissionSetTimeGranted = (res == PackageManager.PERMISSION_GRANTED);
關於您的評論的評論:我不明白為什么運行chmod 666 /dev/alarm
會改變任何東西(除了這可能是為什么您的應用程序凍結而不是簡單地返回false
)
解決方案是:
在設置日期/時間后重新為視圖充氣:
dateAndTimeView = ( DateAndTimeSetupView ) View.inflate( DateAndTimeSetupController.this, R.layout.date_and_time_setup, null );
setContentView( dateAndTimeView );
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.