簡體   English   中英

如何將數據傳遞給BroadcastReceiver?

[英]How to pass data to BroadcastReceiver?

我想做的是將我的應用程序向其發送消息的號碼傳遞給 BraodcastReceiver ...但到目前為止,我得到的是 null 或 BroadcastReceiver 只是簡單地崩潰了..

這是我從 CreateMessage class 獲得 BroadcastReceiver 的意圖...

        Intent intent = new Intent();
        Bundle bundle = new Bundle();
        bundle.putString("phN", phoneNo);
        intent.putExtras(bundle);
        startActivity(intent);

在 BroadcastReceiver(SmsReceiver 類)中,我試圖捕捉這樣的意圖......

public void onReceive(Context context, Intent intent) {
    //---get the SMS message passed in---
    Bundle bundle = intent.getExtras();
    try{
    //receiveNumbers = intent.getExtras().get("phN").toString();
        String  receiveNumbers = intent.getStringExtra("phN");
        Toast.makeText(context, receiveNumbers, Toast.LENGTH_LONG).show();
    }catch(Exception e){
        e.printStackTrace();
    }

我的清單文件:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.AEM_n"
      android:versionCode="2" android:versionName="2.0">
    <uses-sdk android:minSdkVersion="8" />
    <uses-permission android:name="android.permission.READ_CONTACTS"/>
    <uses-permission android:name="android.permission.READ_SMS"/>    
    <uses-permission  android:name="android.permission.SEND_SMS"/>
    <uses-permission  android:name="android.permission.RECEIVE_SMS"/>

    <application android:icon="@drawable/icon" android:label="@string/app_name" android:debuggable="true">
        <activity android:name=".new_menu"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:label="@string/app_name"
            android:name=".SetEvent" >
            <intent-filter>
                <action android:name="com.AEM_n.SETEVENT" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
            </activity>
            <activity
            android:label="@string/app_name"
            android:name=".AddParticipants" />
            <activity
            android:label="@string/app_name"
            android:name=".CreateMessage" />
            <activity
            android:label="@string/app_name"
            android:name=".DataBaseClass" />
            <activity 
            android:label="@string/app_name"
            android:name=".IntentReceiver"/>
            <activity 
            android:label="@string/app_name"
            android:name=".SmsReceiver"
            />
            <receiver android:name=".SmsReceiver" android:exported="true">
            <intent-filter android:priority="999">
            <action android:name="android.provider.Telephony.SMS_RECEIVED"/>
            </intent-filter>
            </receiver>
    </application>

</manifest>

我已經嘗試了 Stackoverflow 給出的所有答案......但沒有用......

請大家告訴我哪里出錯了...謝謝!

錯誤日志:

04-07 02:34:02.770: ERROR/AndroidRuntime(25593): FATAL EXCEPTION: main
04-07 02:34:02.770: ERROR/AndroidRuntime(25593): java.lang.RuntimeException: Error receiving broadcast Intent { act=com.myapp.myaction (has extras) } in com.AEM_n.SmsReceiver@405a07c8
04-07 02:34:02.770: ERROR/AndroidRuntime(25593):     at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:722)
04-07 02:34:02.770: ERROR/AndroidRuntime(25593):     at android.os.Handler.handleCallback(Handler.java:587)
04-07 02:34:02.770: ERROR/AndroidRuntime(25593):     at android.os.Handler.dispatchMessage(Handler.java:92)
04-07 02:34:02.770: ERROR/AndroidRuntime(25593):     at android.os.Looper.loop(Looper.java:123)
04-07 02:34:02.770: ERROR/AndroidRuntime(25593):     at android.app.ActivityThread.main(ActivityThread.java:3701)
04-07 02:34:02.770: ERROR/AndroidRuntime(25593):     at java.lang.reflect.Method.invokeNative(Native Method)
04-07 02:34:02.770: ERROR/AndroidRuntime(25593):     at java.lang.reflect.Method.invoke(Method.java:507)
04-07 02:34:02.770: ERROR/AndroidRuntime(25593):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:862)
04-07 02:34:02.770: ERROR/AndroidRuntime(25593):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:620)
04-07 02:34:02.770: ERROR/AndroidRuntime(25593):     at dalvik.system.NativeStart.main(Native Method)
04-07 02:34:02.770: ERROR/AndroidRuntime(25593): Caused by: java.lang.NullPointerException
04-07 02:34:02.770: ERROR/AndroidRuntime(25593):     at com.AEM_n.SmsReceiver.onReceive(SmsReceiver.java:37)
04-07 02:34:02.770: ERROR/AndroidRuntime(25593):     at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:709)
04-07 02:34:02.770: ERROR/AndroidRuntime(25593):     ... 9 more

按照@Jason 的例子……我這樣做了……

在 MainActivity 或您要從中發送意圖的任何活動中

Intent intent = new Intent("my.action.string");
intent.putExtra("extra", phoneNo); \\ phoneNo is the sent Number
sendBroadcast(intent);

然后在我的 SmsReceiver Class 中我做了這個

public void onReceive(Context context, Intent intent) {
  String action = intent.getAction();

  Log.i("Receiver", "Broadcast received: " + action);

  if(action.equals("my.action.string")){
     String state = intent.getExtras().getString("extra");

  }
}

在 manifest.xml 中我添加了"my.action.string" ,雖然它是一個選項..

<receiver android:name=".SmsReceiver" android:enabled="true">
    <intent-filter>
        <action android:name="android.provider.Telephony.SMS_RECEIVED" />
        <action android:name="my.action.string" />
        <!-- and some more actions if you want -->
    </intent-filter>
</receiver>

像魅力一樣工作!

您開始Activity而不是廣播Intent 嘗試改變

startActivity(intent);

sendBroadcast(intent);

更新

您沒有為Intent設置任何操作和組件名稱。 嘗試創建意圖如下:

Intent intent = new Intent(context, YourReceiver.class);
intent.putExtra("phN", phoneNo);
sendBroadcast(intent);

你會像這樣發送一個廣播:

Intent intent = new Intent(action);
intent.putExtra("phN", phoneNo);
sendBroadcast(intent);

action參數是一個String ,它與您注冊BroadcastReceiver的操作相關。 所以如果你像這樣注冊你的接收器:

MyBroadcastReceiver receiver = new MyBroadcastReceiver();
registerReceiver( receiver, new IntentFilter( "com.myapp.myaction" ) );

那么action將是"com.myapp.myaction"

你的問題其實很簡單。 像這樣更改 onReceive() 代碼就足夠了:

public void onReceive(Context context, Intent intent) {
    String action = intent.getAction();

    Log.i("Receiver", "Broadcast received: " + action);

   if(action.equals("my.action.string")){
       String state = bundle.getString("phN");

   }
}

在活動中

Intent intent = new Intent(context, destinationActivity);
// Send String
intent.putExtra(Intent.EXTRA_TEXT, mNameEntryString);
// Send int
intent.putExtra("intVariableName", intValue);
startActivity(intent);

在接收器中

Intent intent = getIntent();
// get string
String recievedString = intent.getStringExtra(Intent.EXTRA_TEXT);
// get int
int intValue = intent.getIntExtra("intVariableName", 0); // 0 je default

使用 sendbroadcast 而不是 startactivity。它會工作..!!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM