应用未处于活动状态时未接来电通知

时间:2013-09-11 09:34:27

标签: android android-service android-broadcast

我用BroadcastReceiver(用于电话状态)编写了一个联系人列表应用程序,它在WindowManager的帮助下通知用户每个未接来电(类似于“any.do”等应用中的提醒)。问题是只有在我的应用程序运行时才能运行,只要我关闭它,这个通知就会被禁用。但是,当应用程序未处于活动状态时,用户应该收到有关每个未接来电的明确消息(包括有关处理此未接来电的特定功能)。

这是我的接收器

public class CallReceiver extends BroadcastReceiver {

private static String lastState = TelephonyManager.EXTRA_STATE_IDLE;

@Override
public void onReceive(final Context context, Intent intent) {

这是AndroidManifest的一部分

<receiver android:name="addressbook.CallReceiver" >
        <intent-filter>
            <action android:name="android.intent.action.PHONE_STATE" />
        </intent-filter>
    </receiver>

我的下一步是编写一项服务来完成这项工作,并检查这是否符合我的要求。我们的想法不是使用BroadcastReceiver,而是在服务中注册contentObserver,检查调用日志中是否存在新的未接来电。我试图遵循我在这个论坛中可以找到的有关服务的所有建议,但我无法启动该服务。

这是AndroidManifest中的一部分

 <service 
        android:name="addressbook.ContentObserverService"
        android:enabled="true"/>

这是我尝试在AddressBook.java中启动该服务的地方

startService(new Intent(getApplicationContext(), ContentObserverService.class));

public class ContentObserverService extends Service {

private Observer observer;

public void onCreate() {
    super.onCreate();
    D.d("observer created");
    Handler handler = new Handler();
    observer = new Observer(handler);
    getContentResolver().registerContentObserver(Calls.CONTENT_URI, true, observer);
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    D.d("onStartCommand");
    super.onStartCommand(intent, flags, startId);
    return Service.START_STICKY;
}

@Override
public void onDestroy() {
    super.onDestroy();
    getContentResolver().unregisterContentObserver(observer);
}

但onCreate和onStartCommand方法都没有被调用,我也没有收到任何错误或警告。

所以我有两个问题:

  1. 是我的问题的正确解决方案,或者是否存在更好的解决方案
  2. 如果服务是正确的解决方案,为什么不启动?
  3. 编辑:扼杀的事情是,广播接收者的解决方案总是在模拟器上工作(即使我的应用关闭)。这个问题只发生在我打电话给我真正的手机时。

1 个答案:

答案 0 :(得分:1)

执行以下操作,

1)注册PhoneStateChange接收器。 Tutorial for BroadCast receiver

2)检查是否是未接来电。

3)如果是未接来电,请启动intentService以显示通知。 Tutorial for intentService

编辑: - 在Manifest中注册Receiver,即使app未打开也可以正常工作。

1)创建一个独立的类(无内部类),用Broadcast Receiver扩展它。 see in detail here

2)您需要在AndroidManifest文件中添加Receiver。如下所示

    <receiver android:name="MyPhoneReceiver" > // this is name of your receiver class
            <intent-filter>
                <action android:name="android.intent.action.PHONE_STATE" >
                </action>
            </intent-filter>
        </receiver>

3)获得适当的许可,一个是

<uses-permission android:name="android.permission.READ_PHONE_STATE" />

即使您的应用已关闭也可以使用