2

我是初学者 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);
4

2 回答 2

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 活动。

如果您想将信息从广播接收器传输到您的活动,请参阅此 stackoverflow 问题

于 2011-04-21T10:59:45.593 回答
0

您可以从活动中调用广播接收器。您需要注册和注销接收者,并且还需要在代码中调用 sendbroadcastereciver()

于 2011-04-21T10:57:52.307 回答