简体   繁体   English

广播接收器未接收?

[英]Broadcastreceiver not receiving?

I am trying to pass values from service to activity using broadcast 我正在尝试使用广播将价值从服务传递到活动

I am using following code to call broadcast in service 我正在使用以下代码调用服务中的广播

            Intent i = new Intent();
            i.putExtra("test",result);
            sendBroadcast(i);

And receiving in main activity using following code 并使用以下代码接收主要活动

     public class myreciver extends BroadcastReceiver{
            public String data =null;
            @Override
        public void onReceive(Context context, Intent intent) {
                String action = intent.getAction();
                String datapassed = intent.getStringExtra("test");

         }
 }

In Main Activity 在主要活动中

             myreciver m = new myreciver();
             IntentFilter intentFilter = new IntentFilter();
             intentFilter.addAction(MyService.MY_ACTION);
             registerReceiver(m, intentFilter);

but my receiver is not called. 但我的接收器没有被呼叫

Manifest file 清单文件

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.pragadees.restex" >

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <receiver android:name=".MainActivity$myreciver" >
        </receiver>

        <service
            android:name=".MyIntentService"
            android:exported="false" >
        </service>
        <service
            android:name=".MyService"
            android:enabled="true"
            android:exported="false" >
        </service>

        <activity
            android:name=".display"
            android:label="@string/title_activity_display" >
        </activity>
    </application>

</manifest>

Action missing in Intent which is passing to sendBroadcast method.do it as: 传递给sendBroadcast方法的Intent中缺少动作

Intent i = new Intent(MyService.MY_ACTION); //<< pass Action to Intent
i.putExtra("test",result); 
sendBroadcast(i);

use broad cast like this 像这样使用广泛的演员表

 Intent i = new Intent("Broadcastname");

            context.sendBroadcast(i);

and now receive broad cast like this way 现在以这种方式获得广泛的演员

@Override
    protected void onResume() {
        // TODO Auto-generated method stub
        super.onResume();
        IntentFilter intentFilter = new IntentFilter("Broadcastname");
    BroadcastReceiver   Receiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {

                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        // TODO Auto-generated method stub
                        // to your work here 

                    }
                });

            }
        };

    this.registerReceiver(Receiver, intentFilter);

finally unregister in onstop() method 最终在onstop()方法中注销

@Override
    protected void onStop() {
        // TODO Auto-generated method stub

        if (Receiver != null) {
            this.unregisterReceiver(this.Receiver);
        }
        super.onStop();
    }

Android's BroadcastReceiver is part of a framework that allows activities and services to send data to one another, even if they belong to separate apps. Android的BroadcastReceiver是框架的一部分,该框架允许活动和服务相互发送数据,即使它们属于单独的应用程序也是如此。 This is how apps share data with one another, such as when you share a picture from your gallery to Facebook or G+. 这是应用之间相互共享数据的方式,例如,当您将图片从图库共享到Facebook或G +时。 However, this extensive capability means that you have to be careful about how you filter your requests, which means that it can be harder to just send a quick message from inside your own app. 但是,这种强大的功能意味着您必须小心如何过滤请求,这意味着仅从您自己的应用程序内部发送快速消息可能会更加困难。

If you don't need to worry about receiving data from other apps, then you can use the LocalBroadcastManager , which is an implementation of BroadcastReceiver that is confined inside of your own app's jurisdiction. 如果您不必担心会从其他应用程序接收数据,则可以使用LocalBroadcastManager ,它是BroadcastReceiver一种实现,它局限于您自己的应用程序的管辖范围之内。 It can't send or receive intents from outside your app. 它无法从您的应用程序外部发送或接收意图。 Its interface is nearly identical to BroadcastReceiver 's: 它的接口几乎与BroadcastReceiver的接口相同:

public class MyActivity extends Activity {

  private LocalBroadcastManager mBroadcastManager;

  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    mBroadcastManager = LocalBroadcastManager.getInstance(this);

    //Build an intent filter so you only receive relevant intents
    IntentFilter intentFilter = new IntentFilter();
    intentFilter.addAction("Test from Service to Activity");

    //Register a new BroadcastReceiver with the LocalBroadcastManager
    mBroadcastManager.registerReceiver(new BroadcastReceiver() {
      @Override
      public void onReceive(Context context, Intent intent) {

        String action = intent.getAction();
        String dataPassed = intent.getStringExtra("test");

      }                               
    }, intentFilter);

    //If you ever want to send a broadcast, use this:
    Intent sendIntent = new Intent(this, MyService.class);
    sendIntent.setAction("Test from Activity to Service");
    sendIntent.putExtra("test", "This is a test from Activity!");
    mBroadcastManager.sendBroadcast(sendIntent);
  }
}

//Then in your Service...

public class MyService extends Service {

  private LocalBroadcastManager mBroadcastManager;

  public void onCreate() {
    mBroadcastManager = LocalBroadcastManger.getInstance(this);
  }

  public int onStartCommand(Intent intent, int flags, int startId) {

    //Build intent filter
    IntentFilter intentFilter = new IntentFilter();
    intentFilter.addAction("Test from Activity to Service");

    mBroadcastManger.registerReceiver(new BroadcastReceiver() {
      @Override
      public void onReceive(Context context, Intent intent) {

        String action = intent.getAction();
        String dataPassed = intent.getStringExtra("test");

      }

    }, intentFilter);

    //To send data to the activity:
    Intent sendIntent = new Intent(this, MyActivity.class);
    sendIntent.setAction("Test from Service to Activity");
    sendIntent.putExtra("test", "This is a test from Service!");
    mBroadcastManager.sendBroadcast(sendIntent);
  }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM