从Activity调用BroadcastReceiver

时间:2011-04-21 10:46:15

标签: android android-broadcast

我是初学Android开发者。
我试图从Activity调用BroadcastReceiver,因为如果有人给我打电话,我需要更新条目。

这是我调用BroadcastReceiver的活动。

源代码:

public class CalendarCall extends Activity {

    private static final String TAG = "CalendarCall";

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Intent i = new Intent(this, MyBroadcastReceiver.class);
        startActivity(i);
    }  
    // ......
}

MyBroadcastReceiver.class:

package org.example.calendarcall;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.TelephonyManager;
import android.util.Log;

public class MyBroadcastReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
         Bundle extras = intent.getExtras();
         if (extras != null) {
                String state = extras.getString(TelephonyManager.EXTRA_STATE);
                Log.w("DEBUG", state);
                if (state.equals(TelephonyManager.EXTRA_STATE_RINGING)) {
                    String phoneNumber = extras
                            .getString(TelephonyManager.EXTRA_INCOMING_NUMBER);
                    Log.w("DEBUG", phoneNumber);
                }
         }
     }
}

清单:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="org.example.calendarcall"
      android:versionCode="1"
      android:versionName="1.0">
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".CalendarCall"
                  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="MyBroadcastReceiver">
        </receiver>
    </application>
    <uses-sdk android:minSdkVersion="8" />

<uses-permission android:name="android.permission.READ_CONTACTS"/>
<uses-permission android:name="android.permission.READ_CALENDAR"/>
<uses-permission android:name="android.permission.WRITE_CALENDAR"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
</manifest> 

错误:

04-21 12:37:40.821: ERROR/AndroidRuntime(793): java.lang.RuntimeException: Unable to start activity ComponentInfo{org.example.calendarcall/org.example.calendarcall.CalendarCall}: android.content.ActivityNotFoundException: Unable to find explicit activity class {org.example.calendarcall/org.example.calendarcall.MyBroadcastReceiver}; 

我认为问题是Manifest中的声明,我也不知道我是否可以使用Activity调用BroadcastReceiver:

Intent i = new Intent(this, MyBroadcastReceiver.class);
startActivity(i);

2 个答案:

答案 0 :(得分:2)

BroadCastReceiver接收来自发送方的调用sendBroadcast()方法的意图。如果您希望在有人呼叫您时调用MyBroadcastReceiver,您可以添加过滤器android.intent.action.PHONE_STATE,如:

  <receiver android:name=".MyBroadcastReceiver">

    <intent-filter>

      <action android:name="android.intent.action.PHONE_STATE" />

    </intent-filter>

</receiver>

您并不真正需要CalendarCall活动。

如果您想将广播接收器中的信息传输到您的活动,请参阅this stackoverflow question

答案 1 :(得分:0)

您可以通过活动呼叫广播接收器。 你需要注册和取消注册接收者,你需要在你的代码中调用sendbroadcast receiver()