我用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方法都没有被调用,我也没有收到任何错误或警告。
所以我有两个问题:
编辑:扼杀的事情是,广播接收者的解决方案总是在模拟器上工作(即使我的应用关闭)。这个问题只发生在我打电话给我真正的手机时。
答案 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" />
即使您的应用已关闭也可以使用