2013-06-25 46 views
0

首先,我搜索了這個問題,發現了大約2-3個計算器鏈接,但我沒有得到明確的答案。基本上,我的應用程序需要在手機停靠時啓動一項活動(任何類型碼頭或)時,屏幕是off.I註冊的廣播接收器清單:停靠和關閉廣播服務

<receiver android:name=".BootReciever"> 
<intent-filter > 
    <action android:name="android.intent.action.ACTION_DOCK_EVENT"/> 
    <action android:name="android.intent.action.SCREEN_OFF"/> 
</intent-filter> 
</receiver> 

而且在我的課:

public class BootReciever extends BroadcastReceiver{ 
@Override 
public void onReceive(Context context, Intent intent) { 
    String action = intent.getAction(); 
if(action.equals(Intent.ACTION_DOCK_EVENT)){ 
     //work for dock 
    } 

    if (action.equals(Intent.ACTION_SCREEN_OFF)) { 
     //work for screen off 
    } 

} 
} 

但兩者犯規work.My工作還沒有做的是兩種情況。我讀到了我必須在服務中做到這一點,但因爲我從來沒有使用過我自己的服務,所以我倒下了id.developers.com有點親友好,我很難得到它的工作。可以有人說我如何實現上述?我的應用程序必須聽它作爲長期service.So即使當我的應用程序不foreground.Thanks你的幫助。

回答

0

SCREEN_OFF肯定已經被註冊編程(見this link例如,it'a一個protected intent):

public class MainActivity extends Activity { 
    BroadcastReceiver receiver; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     try { 
      receiver = new BroadcastReceiver() { 
       @Override 
       public void onReceive(Context context, Intent intent) { 
        Log.d("TAG", "on or off"); 
       } 
      }; 
      IntentFilter filter = new IntentFilter(); 
      filter.addAction(Intent.ACTION_SCREEN_OFF); 
      Log.d("TAG", "Register receiver"); 
      registerReceiver(receiver, filter); 

     } catch (Exception e) { 
      Log.d("TAG", "Caught: " + e.getStackTrace()); 
     } 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 

     try { 
      Log.d("TAG", "Unregister receiver"); 
      unregisterReceiver(receiver); 

     } catch (Exception e) { 
      Log.d("TAG", "Caught: " + e.getStackTrace()); 
     } 
    } 
} 

ACTION_DOCK_EVENT我會假設別的東西是錯誤的。可能是因爲ACTION_SCREEN_OFFACTION_SCREEN_OFF的組合不起作用,可能是由於命名問題(例如,我不希望相對路徑爲.BootReciever;例如,檢查是否有全限定類名)。

希望這會有所幫助....乾杯!

+0

謝謝你會檢查both.Althought這將是第一,因爲我可以把這個在我的廣播接收機班,並檢查出來。此外,我已計劃意圖上課bootcomplete.Will儘快嘗試,讓我們知道結果!再次感謝! – user2515577

+0

我試過這個答案和第二個答案[this](http://stackoverflow.com/questions/12681884/android-broadcast-receiver-doesnt-receive-action-screen-on)link.But它不工作me.Its似乎覺得很難實現這個小函數?我不知道該怎麼做。詢問是錯誤的,但任何人都可以給我一個示例應用程序源,它運行一個服務來註冊一個屏幕並運行一個塊screenoff上的代碼?感謝和抱歉的麻煩... – user2515577

+0

查看上面的完整活動示例(這是一個新創建的應用程序的示例) – Trinimon

0

這類意圖的接收者需要在代碼中動態註冊。

 this.receiver = new BootReceiver(); 
     final IntentFilter filter = new IntentFilter(); 
     filter.addAction(Intent.ACTION_SCREEN_OFF); 
     filter.addAction(Intent.ACTION_DOCK_EVENT); 
     this.registerReceiver(receiver, filter); 

你可以在任何活動(寄存器在onStart(),在的onStop註銷(),見visible lifetime節),或在你的應用程序對象做到這一點。

雖然動態註冊的問題是您的應用程序必須在BootReceiver可以接收意圖之前啓動。

+0

我應該把它放在我的主要活動嗎?這不需要手動啓動我的應用程序,而不像手動啓動應用程序的充電器連接廣播那樣工作嗎? 所以我的工作應該註冊一個啓動完整的廣播,然後調用這個代碼塊嗎?對不起,我是新手,我需要以新手方式獲取每個信息:) – user2515577

+0

如果你沒有實現一個服務並且你需要重新開始一個特定的活動:是的,將接收器註冊到該活動的onCreate()中,並在'onDestroy()'中取消註冊。 – Trinimon

+0

我試過這個答案和第二個答案[this](http://stackoverflow.com/questions/12681884/android-broadcast-receiver-doesnt-receive-action-screen-on)link.But它不工作me.Its似乎覺得很難實現這個小函數?我不知道該怎麼做。詢問是錯誤的,但任何人都可以給我一個示例應用程序源,它運行一個服務來註冊一個屏幕並運行一個塊在屏幕上的代碼?感謝和抱歉的煩惱.... – user2515577