Java Android LocalBroadcast管理器onReceive不工作

Java Android LocalBroadcast管理器onReceive不工作,java,android,android-broadcastreceiver,localbroadcastmanager,Java,Android,Android Broadcastreceiver,Localbroadcastmanager,我尝试在android服务类中使用localbroadcastreceivers。但是当它运行时,主活动中的onReceive方法不会被调用。我看了几个例子和教程,但没有发现问题 主要活动 BroadcastReceiver receiver; @Override protected void onStart() { // TODO Auto-generated method stub super.onStart(); Loca

我尝试在android服务类中使用localbroadcastreceivers。但是当它运行时,主活动中的onReceive方法不会被调用。我看了几个例子和教程,但没有发现问题

主要活动

BroadcastReceiver receiver;


    @Override
    protected void onStart() {
        // TODO Auto-generated method stub
        super.onStart();
        LocalBroadcastManager.getInstance(this).registerReceiver((receiver), 
                new IntentFilter(TestService.COPA_MESSAGE)
            );
    }

    @Override
    protected void onStop() {
        // TODO Auto-generated method stub
         LocalBroadcastManager.getInstance(this).unregisterReceiver(receiver);
        super.onStop();
    }
onCreate方法

receiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                String s = intent.getStringExtra(TestService.COPA_MESSAGE);
                Toast.makeText(getApplicationContext(),"Result - " + s, Toast.LENGTH_LONG).show();
                System.out.println("Result - " + s);
                // do something here.
            }
        };
测试服务类

LocalBroadcastManager broadcaster;
    static final public String COPA_RESULT = "com.controlj.copame.backend.COPAService.REQUEST_PROCESSED";
    static final public String COPA_MESSAGE = "com.controlj.copame.backend.COPAService.COPA_MSG";

    @Override
    public IBinder onBind(Intent intent) {
        // TODO: Return the communication channel to the service.
        throw new UnsupportedOperationException("Not yet implemented");

    }


    public void sendResult(String message) {
        Intent intent = new Intent(COPA_RESULT);
        if(message != null)
            intent.putExtra(COPA_MESSAGE, message);
            broadcaster.sendBroadcast(intent);
    }


    @Override
    public void onCreate() {
        // TODO Auto-generated method stub
        Toast.makeText(getApplicationContext(), "Service Created", 1).show();
        broadcaster = LocalBroadcastManager.getInstance(this);
        super.onCreate();
    }

    @Override
    public void onDestroy() {
        // TODO Auto-generated method stub
        Toast.makeText(getApplicationContext(), "Service Destroy", 1).show();
        super.onDestroy();
    }



public void sendResult(String message) {
        Intent intent = new Intent(COPA_RESULT);
        if(message != null)
            intent.putExtra(COPA_MESSAGE, message);
            broadcaster.sendBroadcast(intent);
            LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
    }


@Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        // TODO Auto-generated method stub
        Toast.makeText(getApplicationContext(), "Service Running ", 1).show();


            class HttpAsync extends AsyncTask<String, Void, String> {


            @Override
            protected String doInBackground(String... params) {

                String result = null; 
                MyDefaultHttpClient client = MyDefaultHttpClient.getInstance();
                HttpPost httpPost = new HttpPost("url");
                try {

                    List<NameValuePair> data = new ArrayList<NameValuePair>();
                    data.add(new BasicNameValuePair("mob_no", "0112888788"));

                    httpPost.setEntity(new UrlEncodedFormEntity(data));
                    HttpResponse responce = client.execute(httpPost);
                    InputStream in = responce.getEntity().getContent();
                    BufferedReader br = new BufferedReader(
                    new InputStreamReader(in));
                    StringBuilder responceStr = new StringBuilder();
                    String responceLineStr = null;
                    while ((responceLineStr = br.readLine()) != null) {
                        responceStr.append(responceLineStr);
                    }
                    br.close();
                    in.close();
                    result = responceStr.toString();
                } catch (ClientProtocolException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                return result;
            }

            @Override
            protected void onPostExecute(String result) {
                // TODO Auto-generated method stub
                super.onPostExecute(result);
                if ((result != null) || (result != "")){
                    System.out.println("Myresult"+ result);

                    try {   
                        sendResult("My Test");
                        PushNotification(getApplicationContext());
                        String recData[] = result.split("#");
                        System.out.println("Moblile  "+ recData[0]);    
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
        }
        HttpAsync a = new HttpAsync();
        a.execute();

        return super.onStartCommand(intent, flags, startId);
    }
LocalBroadcastManager广播公司;
静态最终公共字符串COPA_RESULT=“com.controlj.copame.backend.COPAService.REQUEST_PROCESSED”;
静态最终公共字符串COPA_MESSAGE=“com.controlj.copame.backend.COPAService.COPA_MSG”;
@凌驾
公共IBinder onBind(意向){
//TODO:将通信通道返回到服务。
抛出新的UnsupportedOperationException(“尚未实现”);
}
公共void sendResult(字符串消息){
意向意向=新意向(COPA_结果);
如果(消息!=null)
意向书(COPA_报文,报文);
广播者。发送广播(意图);
}
@凌驾
public void onCreate(){
//TODO自动生成的方法存根
Toast.makeText(getApplicationContext(),“服务已创建”,1.show();
broadcaster=LocalBroadcastManager.getInstance(this);
super.onCreate();
}
@凌驾
公共空间{
//TODO自动生成的方法存根
Toast.makeText(getApplicationContext(),“服务销毁”,1.show();
super.ondestory();
}
公共void sendResult(字符串消息){
意向意向=新意向(COPA_结果);
如果(消息!=null)
意向书(COPA_报文,报文);
广播者。发送广播(意图);
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
}
@凌驾
公共int onStartCommand(Intent Intent、int标志、int startId){
//TODO自动生成的方法存根
Toast.makeText(getApplicationContext(),“正在运行的服务”,1.show();
类HttpAsync扩展了异步任务{
@凌驾
受保护的字符串doInBackground(字符串…参数){
字符串结果=null;
MyDefaultHttpClient=MyDefaultHttpClient.getInstance();
HttpPost HttpPost=新的HttpPost(“url”);
试一试{
列表数据=新的ArrayList();
添加数据(新的BasicNameValuePair(“移动编号”,“0112888788”);
setEntity(新的UrlEncodedFormEntity(数据));
HttpResponse response=client.execute(httpPost);
InputStream in=response.getEntity().getContent();
BufferedReader br=新的BufferedReader(
新的InputStreamReader(in);
StringBuilder responcest=新建StringBuilder();
字符串responceLineStr=null;
而((responceLineStr=br.readLine())!=null){
responceStr.append(responceLineStr);
}
br.close();
in.close();
结果=responceStr.toString();
}捕获(客户端协议例外e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
返回结果;
}
@凌驾
受保护的void onPostExecute(字符串结果){
//TODO自动生成的方法存根
super.onPostExecute(结果);
如果((结果!=null)| |(结果!=“”)){
System.out.println(“Myresult”+结果);
试试{
发送结果(“我的测试”);
PushNotification(getApplicationContext());
字符串recData[]=result.split(“#”);
System.out.println(“Moblile”+recData[0]);
}捕获(例外e){
e、 printStackTrace();
}
}
}
}
HttpAsync a=新的HttpAsync();
a、 执行();
返回super.onStartCommand(intent、flags、startId);
}

您应该在onResume()中注册接收者,并在onPause()中注销接收者。如API中所述:当活动对用户可见和隐藏时,可以多次调用onStart()和onStop()方法。为什么使用本地广播接收器而不是绑定的本地服务模式?@Opiatefuchs您是否建议减少调用
onResume
/
onPause
的频率?onPause()将在应用程序关闭或释放焦点时定义调用,onResume()将在焦点返回或应用程序将启动(或重新启动)时定义调用。不能100%保证调用onStop(),因此仅出于这个原因,就应该在onResume()/onPause()中调用它。但我的意思是,当onStop最终被调用时,接收方是未注册的。API中没有描述,但我在我的三星Galaxy S3(根目录)上看到过这种行为,最终调用了onStop()(在简单的hello world演示应用程序中)。这可能是一个错误的实现系统,但它确实存在。…@Opiatefuchs请参阅
android.app.Activity
文档和^F onStop:
''例如,您可以在onStart()中注册一个BroadcastReceiver来监视影响您的UI的更改,并在onStop()中注销它当用户不再看到您正在显示的内容时。“
您应该在onResume()中注册接收器,并在onPause()中注销它。如API中所述:onStart()和onStop()方法可以多次调用,因为用户可以看到和隐藏活动。为什么使用本地广播接收器而不是绑定的本地服务模式?@Opiatefuchs