2016-02-13 93 views
0

我想创建一个没有UI的后台应用程序。 所以,我有一个广播接收器,我试图从清单注册它。这是我在我的清单中所做的:如何注册Manifest的广播接收器?

<receiver 
     android:name="background.broadcastReceivers.GPSStartedReceiver"> 

     <intent-filter android:priority="100"> 
      <action 
       android:name="android.location.PROVIDERS_CHANGED" 
       android:enabled="true"/> 
     </intent-filter> 
</receiver> 

但是,当我运行应用程序时,广播接收器永远不会被注册。 当我从测试活动注册接收器时,它工作正常。 为什么会发生这种情况?

这是我的测试活动中做:

private GPSStartedReceiver receiver = new GPSStartedReceiver(); 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     // Register a broadcast receiver which listens to GPS provider changes 
     this.registerReceiver(receiver, 
       new IntentFilter("android.location.PROVIDERS_CHANGED")); 
    } 
+0

你在做什么工作可行? –

+0

我编辑了问题 – Manos

回答

3

我想创建一个没有UI的后台应用程序。

这是不实际的。

但是,当我运行应用程序时,广播接收器永远不会被注册。当我从测试活动注册接收器时,它工作正常。为什么会发生这种情况?

清单注册的接收器在安装时不起作用。他们仅在使用明确的Intent启动应用程序的某个组件之后才能工作。对于99.9%的应用程序,这是他们的主屏幕启动器活动。

+0

谢谢!我可以从另一个应用程序注册接收器吗? – Manos

+0

@Manos:我不太确定你为什么将它分成两个应用程序。话虽如此,欢迎其他应用程序发送广播或在您的非UI应用程序中使用明确的“Intent”启动服务。当它检测到您的非UI应用程序已安装时,可能会这样做。此时,您的无UI应用程序的清单注册接收器将工作。 – CommonsWare

+0

我在分裂它,因为它是我大学的一个项目,我被要求。否则我不会分裂,除了练习之外,我看不到任何理由。 – Manos

0

我写了一个很小的应用程序具有以下清单项:

<receiver android:name="test.Receiver"> 
    <intent-filter> 
     <action android:name="android.location.PROVIDERS_CHANGED"/> 
    </intent-filter> 
</receiver> 

而且test.Receiver类:

package test; 

import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.util.Log; 

public class Receiver extends BroadcastReceiver { 

    @Override 
     public void onReceive(Context context, Intent intent) { 
      Log.d("@@@", "here"); 
     } 
    } 

当我在设备上切换GPS时,会打印我的日志消息。也许你的清单XML有太多额外的东西呢?

+0

我已经创建了接收器类,但它不起作用。问题在于注册。如果没有活动,我无法注册接收器。 – Manos

+0

您是否尝试过我建议的内容,并使用上述示例创建了一个简单的测试应用程序? –

+0

是的。 CommonsWare已经给出了问题的答案。一探究竟。你也可以知道它! :D – Manos

相关问题