2013-06-25 47 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