从广播接收器phoneListener启动服务 [英] Start Service from BroadcastReceiver phoneListener

查看:261
本文介绍了从广播接收器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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆