2011-04-21 18 views
2

我是初学Android开发者。
我想从Activity中调用BroadcastReceiver,因为如果有人给我打电话,我需要更新条目。来自Activity的Call 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}; 

我认为这个问题是在清单declaraction,我也不知道如果我可以从活动使用呼叫广播接收器:

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

回答

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

+0

我添加了意图过滤器,但也有相同的错误:04-21 13:10:40.181:ERROR/AndroidRuntime(970):引起:android.content.ActivityNotFoundException:无法找到显式活动类{org.example。 calendarcall/org.example.calendarcall.MyBroadcastReceiver};我需要CalendarCall活动,因为有很多按钮,如填充日历,... – Husky 2011-04-21 11:13:08

+1

如果你只想从你的CalendarCall活动调用你的MyBroadcastReceiver,那么你不会真的想要一个BroadcastReceiver,而是一个标准的活动。您的错误是由于您尝试启动MyBroadcastReceiver而引起的,就好像它是普通的活动(它不是)。 – pakerfeldt 2011-04-21 11:21:15

+0

那我该怎么做? – Husky 2011-04-21 11:30:57

0

你可以调用从活动broadcaste reciever。 您需要注册和取消注册接收者,并且您需要在代码中调用sendbroadcastereciver()

相关问题