2014-10-10 46 views
2

我在屏幕睡眠後註冊傳感器。如果設備檢測到搖動事件,必須喚醒屏幕。 如果我將設備連接到系統,設備會正確喚醒。 如果我斷開設備,色度平板電腦不醒來。但三星設備醒來。如果設備檢測到搖動事件,則喚醒屏幕

這樣我就通過在textview中顯示logcat值來進行測試。 我發現了以下問題: 有時在屏幕關閉後,我沒有收到廣播消息。 有時我收到消息,但是在晃動設備後maccel值也沒有增加。

我使用以下代碼:

用於初始化傳感器管理器:

manager=(SensorManager) getSystemService(Context.SENSOR_SERVICE); 
sensor=manager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); 

註冊廣播接收機:

registerReceiver(screenoffreceiver, new IntentFilter(Intent.ACTION_SCREEN_OFF)); 

廣播接收機:

private BroadcastReceiver screenoffreceiver = new BroadcastReceiver() { 
     public void onReceive(Context context, Intent intent) { 
      // TODO Auto-generated method stub 
      Bundle extras = intent.getExtras(); 
      if (Intent.ACTION_SCREEN_OFF.equalsIgnoreCase(intent.getAction())) { 
       //screen has been switched off! 
       manager.registerListener(Testing.this, manager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_NORMAL); 

      } 
     } 
    }; 

用於檢測震動的事件:

public void onSensorChanged(SensorEvent event) { 
      float x = event.values[0]; 
      float y = event.values[1]; 
      float z = event.values[2]; 
      mAccelLast = mAccelCurrent; 
      mAccelCurrent = (float) Math.sqrt((double) (x*x + y*y + z*z)); 
      float delta = mAccelCurrent - mAccelLast; 
      mAccel = mAccel * 0.9f + delta; // perform low-cut filter 
      Log.i("mAccel", "mAccel "+mAccel); 

      mytext.setText(mytext.getText().toString()+" "+mAccel); 

      if(mAccel>=1) { 
       unlock_screen(); 
      } 

請幫我解決這些問題。

回答

0

如果我在設備鎖定後將設備連接到系統,cpu會繼續運行。所以當我調用unlock_screen()方法時,設備醒來。 如果我斷開設備,它進入鎖定模式後,CPU不會運行。因此,當我調用unlock_screen()方法時,設備始終不會喚醒。 所以我使用了PARTIAL_WAKE_LOCK爲了運行Cpu。

0

如果你想確保你的服務沒有被操作系統殺死/回收,你需要把它做成前臺服務。默認情況下,所有服務都是後臺服務,這意味着當操作系統需要資源時它們將被終止有關詳細信息,請參閱此文檔

基本上,您需要爲您的服務創建一個通知並指出它是前臺。這樣用戶將看到一個持久通知,所以他知道你的應用程序正在運行,而操作系統不會終止你的服務。

Intent intent = new Intent(this, typeof(SomeActivityInYourApp)); 
PendingIntent pi = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); 

NotificationCompat.Builder builder = new NotificationCompat.Builder(this); 

builder.setSmallIcon(Resource.Drawable.my_icon); 
builder.setTicker("App info string"); 
builder.setContentIntent(pi); 
builder.setOngoing(true); 
builder.setOnlyAlertOnce(true); 

Notification notification = builder.build(); 

// optionally set a custom view 

startForeground(SERVICE_NOTIFICATION_ID, notification); 
+0

我在這裏沒有使用服務。我在廣播接收器中註冊sensorListener。 – user3128585 2014-10-10 09:11:22

+0

然後嘗試使用服務:)您的廣播接收器需要在活動暫停時工作。或者,如果你不註銷Receiver onPause它是一個內存泄漏... – SpyZip 2014-10-10 09:20:59

+0

我用廣播接收機檢測屏幕關閉,大部分是我收到廣播消息。有時它失敗。還有一些設備,即使我重置mAccel,mAccelLast,在maccel值達到> = 1後,mAccelCurrent的值,在取消註冊和註冊傳感器後,我得到了相同的mAccel值。如果我在logcat中打印傳感器事件值。我得到了以前的x,y,z值。它沒有被重置。 – user3128585 2014-10-10 10:53:01