从广播接收器phoneListener启动服务 [英] Start Service from BroadcastReceiver phoneListener
问题描述
我想停下来的时候,手机铃声响起正在运行的服务,我要当呼叫只是振铃后应答或重新启动该服务。
我总是当电话通话结束的显示java.lang.NullPointerException。
在CALL_STATE_RINGING的alarmManager取消并没有任何错误,服务将停止。再次启动服务,不能正常工作。我得到的所有以下NullPointerException异常的时间。
03-18 19:08:30.280 15795-15795 / de.app.test E / AndroidRuntime:致命异常:主要
工艺:de.app.test,PID:15795
了java.lang.RuntimeException:无法启动意图服务de.app.AppService@430fad88 {FLG =为0x4 = CMP de.ring.volume / de.ring.AppService(有演员)}:显示java.lang.NullPointerException
在android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2767)
在android.app.ActivityThread.access $ 2100(ActivityThread.java:144)
在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1343)
在android.os.Handler.dispatchMessage(Handler.java:102)
在android.os.Looper.loop(Looper.java:212)
在android.app.ActivityThread.main(ActivityThread.java:5137)
在java.lang.reflect.Method.invokeNative(本机方法)
在java.lang.reflect.Method.invoke(Method.java:515)
在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:902)
在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:718)
在dalvik.system.NativeStart.main(本机方法)
显示java.lang.NullPointerException:产生的原因
在de.app.AppService.play(AppService.java:724)
在de.app.AppService.onStartCommand(AppService.java:159)
在android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2750)
在android.app.ActivityThread.access $ 2100(ActivityThread.java:144)
在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1343)
在android.os.Handler.dispatchMessage(Handler.java:102)
在android.os.Looper.loop(Looper.java:212)
在android.app.ActivityThread.main(ActivityThread.java:5137)
在java.lang.reflect.Method.invokeNative(本机方法)
在java.lang.reflect.Method.invoke(Method.java:515)
在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:902)
在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:718)
在dalvik.system.NativeStart.main(本机方法)
03-18 19:08:34.970 15795-15795 / de.app.test I /工艺:发送信号。 PID:15795 SIG:9
03-18 19:08:44.560 16362-16362 / de.app.test I / dalvikvm:启用JNI应用程序错误的解决方法目标SDK版本8 ...
03-18 19:08:44.620 16362-16362 / de.app.test D / AppService服务:节省preferencesInt:0
03-18 19:08:44.620 16362-16362 / de.app.test D / AppService服务:节省preferencesInt:0
03-18 19:08:44.630 16362-16362 / de.app.test D / AppService服务:节省preferencesInt:0
03-18 19:08:44.630 16362-16362 / de.app.test D / AppService服务:加载preferences:2
03-18 19:08:44.630 16362-16362 / de.app.test I / de.app.AppService:play()方法
03-18 19:08:44.630 16362-16362 / de.app.test D / AndroidRuntime:关闭VM
03-18 19:08:44.630 16362-16362 / de.app.test W / dalvikvm:主题ID = 1:螺纹未捕获的异常退出(组= 0x41685d88)
03-18 19:08:44.640 16362-16362 / de.app.test E / AndroidRuntime:致命异常:主要
工艺:de.app.test,PID:16362
了java.lang.RuntimeException:无法启动意图服务de.app.AppService@42ef56f0 {FLG =为0x4 = CMP de.app.test / de.app.AppService(有演员)}:显示java.lang.NullPointerException
在android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2767)
在android.app.ActivityThread.access $ 2100(ActivityThread.java:144)
在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1343)
在android.os.Handler.dispatchMessage(Handler.java:102)
在android.os.Looper.loop(Looper.java:212)
在android.app.ActivityThread.main(ActivityThread.java:5137)
在java.lang.reflect.Method.invokeNative(本机方法)
在java.lang.reflect.Method.invoke(Method.java:515)
在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:902)
在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:718)
在dalvik.system.NativeStart.main(本机方法)
显示java.lang.NullPointerException:产生的原因
在de.app.AppService.play(AppService.java:724)
在de.app.AppService.onStartCommand(AppService.java:159)
在android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2750)
在android.app.ActivityThread.access $ 2100(ActivityThread.java:144)
在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1343)
在android.os.Handler.dispatchMessage(Handler.java:102)
在android.os.Looper.loop(Looper.java:212)
在android.app.ActivityThread.main(ActivityThread.java:5137)
在java.lang.reflect.Method.invokeNative(本机方法)
在java.lang.reflect.Method.invoke(Method.java:515)
在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:902)
在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:718)
在dalvik.system.NativeStart.main(本机方法)
code:
公共类IncomingCall扩展广播接收器{
TelephonyManager电话;
静态MyPhoneStateListener phoneListener;
公共静态布尔phoneRinging = FALSE;
静态字符串phoneNumber的;
公共无效的onReceive(上下文的背景下,意图意图){ MyPhoneStateListener phoneListener =新MyPhoneStateListener(背景);
电话=(TelephonyManager)上下文
.getSystemService(Context.TELEPHONY_SERVICE);
telephony.listen(phoneListener,PhoneStateListener.LISTEN_CALL_STATE);
} 公共类MyPhoneStateListener扩展PhoneStateListener {
私人上下文的背景下;
MyPhoneStateListener(上下文C){
超();
上下文= C;
}
公共无效onCallStateChanged(INT状态,弦乐incomingNumber){ phoneNumber的= incomingNumber;
AlarmManager alarmManager =(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
意图I =新意图(背景下,AppService.class);
PI的PendingIntent = PendingIntent.getService(背景下,0,I,PendingIntent.FLAG_UPDATE_CURRENT);
开关(州){
案例TelephonyManager.CALL_STATE_IDLE:
Log.d(调试,空闲+ incomingNumber);
// phoneRinging = FALSE;
startAppService(上下文);
打破;
案例TelephonyManager.CALL_STATE_OFFHOOK:
Log.d(调试,摘机+ incomingNumber);
// phoneRinging = FALSE;
startAppService(上下文);
打破;
案例TelephonyManager.CALL_STATE_RINGING:
Log.d(调试,振铃+ incomingNumber);
phoneRinging = TRUE; alarmManager.cancel(PI);
context.stopService(新意图(上下文,AppService.class)); 打破;
}
}
} 公共无效的onDestroy(){
telephony.listen(phoneListener,PhoneStateListener.LISTEN_NONE);
}
公共无效startAppService(上下文C){ 共享preferences共享preferences = preferenceManager.getDefaultShared preferences(C);
意图I =新意图(C,AppService.class);
PI的PendingIntent = PendingIntent.getService(C,0,I,PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager alarmManager =(AlarmManager)c.getSystemService(Context.ALARM_SERVICE);
字节[] = time_night新的字节[] {22,0,6,0};
布尔tB_Mo_i =共享preferences.getBoolean(TB_MO,真正的);
布尔tB_Di_i =共享preferences.getBoolean(TB_DI,真正的);
布尔tB_Mi_i =共享preferences.getBoolean(TB_MI,真正的);
布尔tB_Do_i =共享preferences.getBoolean(TB_DO,真正的);
布尔tB_Fr_i =共享preferences.getBoolean(TB_FR,FALSE);
布尔tB_Sa_i =共享preferences.getBoolean(TB_SA,FALSE);
布尔tB_So_i =共享preferences.getBoolean(TB_SO,真正的);
time_night [0] =(字节)的共享preferences.getInt(TIME_NIG_H_FROM,0);
time_night [1] =(字节)的共享preferences.getInt(TIME_NIG_MIN_FROM,0);
time_night [2] =(字节)共享preferences.getInt(TIME_NIG_H_TO,0);
time_night [3] =(字节)的共享preferences.getInt(TIME_NIG_MIN_TO,0);
i.putExtra(AppService.CHKBOX_ACT_CAL,共享preferences.getBoolean(RB_ACT_CAL,真正的));
i.putExtra(AppService.CHKBOX_ACT_LOUD,共享preferences.getBoolean(RB_ACT_MIN,FALSE));
i.putExtra(AppService.CHKBOX_ACT_NIGHT,共享preferences.getBoolean(CB_ACT_NIGHT,FALSE));
i.putExtra(AppService.TIME,共享preferences.getInt(TIME_NEXT,0));
i.putExtra(AppService.TIME_NOW,共享preferences.getLong(TIME_NOW_SAVE,0));
i.putExtra(AppService.TEXT,共享preferences.getString(TEXT,));
i.putExtra(AppService.TIME_NIGHT,time_night); 诠释UPDATE_TIME = 15;
尝试{
UPDATE_TIME = Integer.valueOf(共享preferences.getString(pref_settings_update_time,15));
}赶上(例外五){ } alarmManager.cancel(PI);
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,System.currentTimeMillis的(),1000 * UPDATE_TIME,PI);
} }
服务:
公众诠释onStartCommand(意向意图,诠释旗帜,INT startId){
set_calendar = intent.getBooleanExtra(CHKBOX_ACT_CAL,真);
set_Loud_sil = intent.getBooleanExtra(CHKBOX_ACT_LOUD,真);
set_night_mode = intent.getBooleanExtra(CHKBOX_ACT_NIGHT,真);
time_loud = intent.getIntExtra(TIME,0);
displ_text = intent.getStringExtra(文本); 玩(displ_text);
跑(); 回报(START_REDELIVER_INTENT);
}私人无效播放(字符串文本){
如果(!IsPlaying模块){
如果(D)Log.i(的getClass()的getName(),play()方法。);
IsPlaying模块= TRUE;
INT time_from_min = time_night [0] * 60 + time_night [1];
INT time_to_min = time_night [2] * 60 + time_night [3];
注意=新的通知(R.drawable.app_status,
文本,System.currentTimeMillis的()); I =新意图(这一点,Activity.class); i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP |
Intent.FLAG_ACTIVITY_SINGLE_TOP); 圆周率= PendingIntent.getActivity(在此,0,I,0); note.setLatestEventInfo(这一点,的getString(R.string.app_name),文本,PI);
note.flags | = Notification.FLAG_NO_CLEAR; 如果(show_notification)startForeground(1505注); }
}
编辑:
如果我改变onCallStateChanged到下面,它的工作原理启动该服务。所以,我怎么可以停止服务和alarmManager ???
公共无效onCallStateChanged(INT状态,弦乐incomingNumber){/ *意向书I =新意图(背景下,AppService.class);
PI的PendingIntent = PendingIntent.getService(背景下,0,I,PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager alarmManager =(AlarmManager)context.getSystemService(Context.ALARM_SERVICE); * / 开关(州){
案例TelephonyManager.CALL_STATE_IDLE:
Log.d(调试,空闲+ incomingNumber);
// phoneRinging = FALSE;
如果(!isServiceRunning(上下文)){
startAppService(上下文);
}
打破;
案例TelephonyManager.CALL_STATE_OFFHOOK:
Log.d(调试,摘机+ incomingNumber);
// phoneRinging = FALSE;
如果(!isServiceRunning(上下文)){ }
打破;
案例TelephonyManager.CALL_STATE_RINGING:
Log.d(调试,振铃+ incomingNumber);
phoneRinging = TRUE; // alarmManager.cancel(PI);
// context.stopService(新意图(背景下,AppService.class)); 打破;
}
}
解决方案:
公共无效startAppService(上下文C,布尔停){ 共享preferences共享preferences = preferenceManager.getDefaultShared preferences(C);
意图I =新意图(C,AppService.class); AlarmManager alarmManager =(AlarmManager)c.getSystemService(Context.ALARM_SERVICE);
字节[] = time_night新的字节[] {22,0,6,0};
布尔tB_Mo_i =共享preferences.getBoolean(TB_MO,真正的);
布尔tB_Di_i =共享preferences.getBoolean(TB_DI,真正的);
布尔tB_Mi_i =共享preferences.getBoolean(TB_MI,真正的);
布尔tB_Do_i =共享preferences.getBoolean(TB_DO,真正的);
布尔tB_Fr_i =共享preferences.getBoolean(TB_FR,FALSE);
布尔tB_Sa_i =共享preferences.getBoolean(TB_SA,FALSE);
布尔tB_So_i =共享preferences.getBoolean(TB_SO,真正的);
time_night [0] =(字节)的共享preferences.getInt(TIME_NIG_H_FROM,0);
time_night [1] =(字节)的共享preferences.getInt(TIME_NIG_MIN_FROM,0);
time_night [2] =(字节)共享preferences.getInt(TIME_NIG_H_TO,0);
time_night [3] =(字节)的共享preferences.getInt(TIME_NIG_MIN_TO,0); 如果(停止){
PI的PendingIntent = PendingIntent.getService(背景下,0,I,PendingIntent.FLAG_UPDATE_CURRENT);
alarmManager.cancel(PI);
context.stopService(新意图(上下文,AppService.class)); }其他{
i.putExtra(AppService.CHKBOX_ACT_CAL,共享preferences.getBoolean(RB_ACT_CAL,真正的));
i.putExtra(AppService.CHKBOX_ACT_LOUD,共享preferences.getBoolean(RB_ACT_MIN,FALSE));
i.putExtra(AppService.CHKBOX_ACT_NIGHT,共享preferences.getBoolean(CB_ACT_NIGHT,FALSE));
i.putExtra(AppService.TIME,共享preferences.getInt(TIME_NEXT,0));
i.putExtra(AppService.TIME_NOW,共享preferences.getLong(TIME_NOW_SAVE,0));
i.putExtra(AppService.TEXT,共享preferences.getString(TEXT,));
i.putExtra(AppService.TIME_NIGHT,time_night); PI的PendingIntent = PendingIntent.getService(C,0,I,PendingIntent.FLAG_UPDATE_CURRENT); 诠释UPDATE_TIME = 15;
尝试{
UPDATE_TIME = Integer.valueOf(共享preferences.getString(pref_settings_update_time,15));
}赶上(例外五){ } alarmManager.cancel(PI);
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,System.currentTimeMillis的(),1000 * UPDATE_TIME,PI); }
}
I want to stop the the running service when the phone is ringing and I want to restart the service when the call is answered or just after ringing.
I always get an java.lang.NullPointerException if the phone call ends. In the CALL_STATE_RINGING the alarmManager cancels and the service stops without any error. Starting the Service again, does not work. I get all the time following NullPointerException.
03-18 19:08:30.280 15795-15795/de.app.test E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: de.app.test, PID: 15795
java.lang.RuntimeException: Unable to start service de.app.AppService@430fad88 with Intent { flg=0x4 cmp=de.ring.volume/de.ring.AppService (has extras) }: java.lang.NullPointerException
at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2767)
at android.app.ActivityThread.access$2100(ActivityThread.java:144)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1343)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:212)
at android.app.ActivityThread.main(ActivityThread.java:5137)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:902)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:718)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NullPointerException
at de.app.AppService.play(AppService.java:724)
at de.app.AppService.onStartCommand(AppService.java:159)
at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2750)
at android.app.ActivityThread.access$2100(ActivityThread.java:144)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1343)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:212)
at android.app.ActivityThread.main(ActivityThread.java:5137)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:902)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:718)
at dalvik.system.NativeStart.main(Native Method)
03-18 19:08:34.970 15795-15795/de.app.test I/Process﹕ Sending signal. PID: 15795 SIG: 9
03-18 19:08:44.560 16362-16362/de.app.test I/dalvikvm﹕ Enabling JNI app bug workarounds for target SDK version 8...
03-18 19:08:44.620 16362-16362/de.app.test D/AppService﹕ SavePreferencesInt: 0
03-18 19:08:44.620 16362-16362/de.app.test D/AppService﹕ SavePreferencesInt: 0
03-18 19:08:44.630 16362-16362/de.app.test D/AppService﹕ SavePreferencesInt: 0
03-18 19:08:44.630 16362-16362/de.app.test D/AppService﹕ LoadPreferences: 2
03-18 19:08:44.630 16362-16362/de.app.test I/de.app.AppService﹕ play() Method
03-18 19:08:44.630 16362-16362/de.app.test D/AndroidRuntime﹕ Shutting down VM
03-18 19:08:44.630 16362-16362/de.app.test W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0x41685d88)
03-18 19:08:44.640 16362-16362/de.app.test E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: de.app.test, PID: 16362
java.lang.RuntimeException: Unable to start service de.app.AppService@42ef56f0 with Intent { flg=0x4 cmp=de.app.test/de.app.AppService (has extras) }: java.lang.NullPointerException
at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2767)
at android.app.ActivityThread.access$2100(ActivityThread.java:144)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1343)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:212)
at android.app.ActivityThread.main(ActivityThread.java:5137)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:902)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:718)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NullPointerException
at de.app.AppService.play(AppService.java:724)
at de.app.AppService.onStartCommand(AppService.java:159)
at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2750)
at android.app.ActivityThread.access$2100(ActivityThread.java:144)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1343)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:212)
at android.app.ActivityThread.main(ActivityThread.java:5137)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:902)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:718)
at dalvik.system.NativeStart.main(Native Method)
Code:
public class IncomingCall extends BroadcastReceiver {
TelephonyManager telephony;
static MyPhoneStateListener phoneListener;
public static Boolean phoneRinging = false;
static String phoneNumber;
public void onReceive(Context context, Intent intent) {
MyPhoneStateListener phoneListener = new MyPhoneStateListener(context);
telephony = (TelephonyManager) context
.getSystemService(Context.TELEPHONY_SERVICE);
telephony.listen(phoneListener, PhoneStateListener.LISTEN_CALL_STATE);
}
public class MyPhoneStateListener extends PhoneStateListener {
private Context context;
MyPhoneStateListener(Context c) {
super();
context = c;
}
public void onCallStateChanged(int state, String incomingNumber) {
phoneNumber = incomingNumber;
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Intent i = new Intent(context, AppService.class);
PendingIntent pi = PendingIntent.getService(context, 0, i, PendingIntent.FLAG_UPDATE_CURRENT);
switch (state) {
case TelephonyManager.CALL_STATE_IDLE:
Log.d("DEBUG", "IDLE" + incomingNumber);
//phoneRinging = false;
startAppService(context);
break;
case TelephonyManager.CALL_STATE_OFFHOOK:
Log.d("DEBUG", "OFFHOOK" + incomingNumber);
//phoneRinging = false;
startAppService(context);
break;
case TelephonyManager.CALL_STATE_RINGING:
Log.d("DEBUG", "RINGING" + incomingNumber);
phoneRinging = true;
alarmManager.cancel(pi);
context.stopService(new Intent(context, AppService.class));
break;
}
}
}
public void onDestroy() {
telephony.listen(phoneListener, PhoneStateListener.LISTEN_NONE);
}
public void startAppService(Context c){
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(c);
Intent i = new Intent(c, AppService.class);
PendingIntent pi = PendingIntent.getService(c, 0, i, PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager alarmManager = (AlarmManager) c.getSystemService(Context.ALARM_SERVICE);
byte[] time_night = new byte[]{22, 0, 6, 0};
boolean tB_Mo_i = sharedPreferences.getBoolean("TB_MO", true);
boolean tB_Di_i = sharedPreferences.getBoolean("TB_DI", true);
boolean tB_Mi_i = sharedPreferences.getBoolean("TB_MI", true);
boolean tB_Do_i = sharedPreferences.getBoolean("TB_DO", true);
boolean tB_Fr_i = sharedPreferences.getBoolean("TB_FR", false);
boolean tB_Sa_i = sharedPreferences.getBoolean("TB_SA", false);
boolean tB_So_i = sharedPreferences.getBoolean("TB_SO", true);
time_night[0] = (byte) sharedPreferences.getInt("TIME_NIG_H_FROM", 0);
time_night[1] = (byte) sharedPreferences.getInt("TIME_NIG_MIN_FROM", 0);
time_night[2] = (byte) sharedPreferences.getInt("TIME_NIG_H_TO", 0);
time_night[3] = (byte) sharedPreferences.getInt("TIME_NIG_MIN_TO", 0);
i.putExtra(AppService.CHKBOX_ACT_CAL, sharedPreferences.getBoolean("RB_ACT_CAL", true));
i.putExtra(AppService.CHKBOX_ACT_LOUD, sharedPreferences.getBoolean("RB_ACT_MIN", false));
i.putExtra(AppService.CHKBOX_ACT_NIGHT, sharedPreferences.getBoolean("CB_ACT_NIGHT", false));
i.putExtra(AppService.TIME, sharedPreferences.getInt("TIME_NEXT", 0));
i.putExtra(AppService.TIME_NOW, sharedPreferences.getLong("TIME_NOW_SAVE", 0));
i.putExtra(AppService.TEXT, sharedPreferences.getString("TEXT", ""));
i.putExtra(AppService.TIME_NIGHT, time_night);
int update_time = 15;
try {
update_time = Integer.valueOf(sharedPreferences.getString("pref_settings_update_time", "15"));
} catch (Exception e) {
}
alarmManager.cancel(pi);
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 1000 * update_time, pi);
}
}
Service:
public int onStartCommand(Intent intent, int flags, int startId) {
set_calendar = intent.getBooleanExtra(CHKBOX_ACT_CAL, true);
set_Loud_sil = intent.getBooleanExtra(CHKBOX_ACT_LOUD, true);
set_night_mode = intent.getBooleanExtra(CHKBOX_ACT_NIGHT, true);
time_loud = intent.getIntExtra(TIME, 0);
displ_text=intent.getStringExtra(TEXT);
play(displ_text);
run();
return(START_REDELIVER_INTENT);
}
private void play(String text) {
if (!isPlaying) {
if(D) Log.i(getClass().getName(), "play() Method");
isPlaying=true;
int time_from_min = time_night[0] * 60 + time_night[1];
int time_to_min = time_night[2] * 60 + time_night[3];
note=new Notification(R.drawable.app_status,
text, System.currentTimeMillis());
i=new Intent(this, Activity.class);
i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|
Intent.FLAG_ACTIVITY_SINGLE_TOP);
pi=PendingIntent.getActivity(this, 0, i, 0);
note.setLatestEventInfo(this, getString(R.string.app_name),text,pi);
note.flags|=Notification.FLAG_NO_CLEAR;
if(show_notification)startForeground(1505, note);
}
}
Edit:
If I change the onCallStateChanged to following, it works starting the service. So how can I stop the service and the alarmManager???
public void onCallStateChanged(int state, String incomingNumber) {
/* Intent i=new Intent(context, AppService.class);
PendingIntent pi = PendingIntent.getService(context, 0, i, PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);*/
switch (state) {
case TelephonyManager.CALL_STATE_IDLE:
Log.d("DEBUG", "IDLE" + incomingNumber);
//phoneRinging = false;
if(!isServiceRunning(context)) {
startAppService(context);
}
break;
case TelephonyManager.CALL_STATE_OFFHOOK:
Log.d("DEBUG", "OFFHOOK" + incomingNumber);
//phoneRinging = false;
if(!isServiceRunning(context)) {
}
break;
case TelephonyManager.CALL_STATE_RINGING:
Log.d("DEBUG", "RINGING" + incomingNumber);
phoneRinging = true;
// alarmManager.cancel(pi);
// context.stopService(new Intent(context, AppService.class));
break;
}
}
Solution:
public void startAppService(Context c, boolean stop){
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(c);
Intent i = new Intent(c, AppService.class);
AlarmManager alarmManager = (AlarmManager) c.getSystemService(Context.ALARM_SERVICE);
byte[] time_night = new byte[]{22, 0, 6, 0};
boolean tB_Mo_i = sharedPreferences.getBoolean("TB_MO", true);
boolean tB_Di_i = sharedPreferences.getBoolean("TB_DI", true);
boolean tB_Mi_i = sharedPreferences.getBoolean("TB_MI", true);
boolean tB_Do_i = sharedPreferences.getBoolean("TB_DO", true);
boolean tB_Fr_i = sharedPreferences.getBoolean("TB_FR", false);
boolean tB_Sa_i = sharedPreferences.getBoolean("TB_SA", false);
boolean tB_So_i = sharedPreferences.getBoolean("TB_SO", true);
time_night[0] = (byte) sharedPreferences.getInt("TIME_NIG_H_FROM", 0);
time_night[1] = (byte) sharedPreferences.getInt("TIME_NIG_MIN_FROM", 0);
time_night[2] = (byte) sharedPreferences.getInt("TIME_NIG_H_TO", 0);
time_night[3] = (byte) sharedPreferences.getInt("TIME_NIG_MIN_TO", 0);
if (stop){
PendingIntent pi = PendingIntent.getService(context, 0, i, PendingIntent.FLAG_UPDATE_CURRENT);
alarmManager.cancel(pi);
context.stopService(new Intent(context, AppService.class));
}else {
i.putExtra(AppService.CHKBOX_ACT_CAL, sharedPreferences.getBoolean("RB_ACT_CAL", true));
i.putExtra(AppService.CHKBOX_ACT_LOUD, sharedPreferences.getBoolean("RB_ACT_MIN", false));
i.putExtra(AppService.CHKBOX_ACT_NIGHT, sharedPreferences.getBoolean("CB_ACT_NIGHT", false));
i.putExtra(AppService.TIME, sharedPreferences.getInt("TIME_NEXT", 0));
i.putExtra(AppService.TIME_NOW, sharedPreferences.getLong("TIME_NOW_SAVE", 0));
i.putExtra(AppService.TEXT, sharedPreferences.getString("TEXT", ""));
i.putExtra(AppService.TIME_NIGHT, time_night);
PendingIntent pi = PendingIntent.getService(c, 0, i, PendingIntent.FLAG_UPDATE_CURRENT);
int update_time = 15;
try {
update_time = Integer.valueOf(sharedPreferences.getString("pref_settings_update_time", "15"));
} catch (Exception e) {
}
alarmManager.cancel(pi);
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 1000 * update_time, pi);
}
}
这篇关于从广播接收器phoneListener启动服务的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!