繁体   English   中英

广播接收器未接收?

[英]Broadcastreceiver not receiving?

我正在尝试使用广播将价值从服务传递到活动

我正在使用以下代码调用服务中的广播

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

并使用以下代码接收主要活动

     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");

         }
 }

在主要活动中

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

但我的接收器没有被呼叫

清单文件

<?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>

传递给sendBroadcast方法的Intent中缺少动作

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

像这样使用广泛的演员表

 Intent i = new Intent("Broadcastname");

            context.sendBroadcast(i);

现在以这种方式获得广泛的演员

@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);

最终在onstop()方法中注销

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

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

Android的BroadcastReceiver是框架的一部分,该框架允许活动和服务相互发送数据,即使它们属于单独的应用程序也是如此。 这是应用之间相互共享数据的方式,例如,当您将图片从图库共享到Facebook或G +时。 但是,这种强大的功能意味着您必须小心如何过滤请求,这意味着仅从您自己的应用程序内部发送快速消息可能会更加困难。

如果您不必担心会从其他应用程序接收数据,则可以使用LocalBroadcastManager ,它是BroadcastReceiver一种实现,它局限于您自己的应用程序的管辖范围之内。 它无法从您的应用程序外部发送或接收意图。 它的接口几乎与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