【问题标题】:my services don't work when app completely closed当应用程序完全关闭时我的服务不起作用
【发布时间】:2017-11-03 13:12:27
【问题描述】:

我知道有很多关于这个问题的问题,我几乎看到了所有问题,但我无法解决我的问题。我有一个使用本地广播管理器调用主要活动的服务,我从该服务中获得一些价值,然后我将它们放入字符串并发送到需要使用它们的其他服务。其中一个服务调用到本地广播,但其中两个在按钮监听器中,我使用警报管理器每 1 分钟重复运行它们,我也在第一个调用主要活动的服务中使用 satrtforeground(),但奇怪的是在某些设备中当设备屏幕关闭或用户从后台(从堆栈)清除应用程序服务不起作用。希望您能帮帮我,谢谢

public class ServiceURL extends Service {


public static final String Service = ServiceURL.class.getName() + "LocationBroadcast";




@Nullable
@Override
public IBinder onBind(Intent intent) {
    return null;
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {


    Notification note = new Notification( 0, null, System.currentTimeMillis() );
    note.flags |= Notification.FLAG_NO_CLEAR;
    startForeground( 42, note );


   // some codee

        Intent i = new Intent(Service);
        i.putExtra("Sobh",prayerTimes.get(0).toString());
        i.putExtra("Sunrise",prayerTimes.get(1).toString());
        i.putExtra("Zohr",prayerTimes.get(2).toString());
        i.putExtra("Asr",prayerTimes.get(3).toString());
        i.putExtra("Sunset",prayerTimes.get(4).toString());
        i.putExtra("Maghreb",prayerTimes.get(5).toString());
        i.putExtra("Isha",prayerTimes.get(6).toString());

        sendBroadcastMessage(i);



    return START_STICKY;
}

@Override
public void onDestroy() {
    super.onDestroy();
}
@Override
public void onCreate() {
    super.onCreate();

}

private void sendBroadcastMessage(Intent intent) {

        LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
}


}

MainActivity.java

   protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

 // some code 
            LocalBroadcastManager.getInstance(this).registerReceiver(
                    new BroadcastReceiver() {
                        @Override
                        public void onReceive(Context context, Intent intent) {



                             Sobh = intent.getStringExtra("Sobh");
                             Sunrise = intent.getStringExtra("Sunrise");
                             Zohr = intent.getStringExtra("Zohr");
                             Sunset = intent.getStringExtra("Sunset");
                             Maghreb = intent.getStringExtra("Maghreb");
                             Asr = intent.getStringExtra("Asr");
                             Isha = intent.getStringExtra("Isha");

                            Log.d("Sobh in main", Sobh);

                                Intent i = new Intent(getApplicationContext(), ServiceAzan.class);

                                i.putExtra("SOBH", Sobh.substring(0, 5));
                                i.putExtra("ZOHR", Zohr.substring(0, 5));
                                i.putExtra("MAGHREB", Maghreb.substring(0, 5));
                                i.putExtra("ASR", Asr.substring(0, 5));
                                i.putExtra("ISHA", Isha.substring(0, 5));
                                PendingIntent pintent = PendingIntent.getService(getApplicationContext(), 0, i, 0);
                                AlarmManager alarm = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
                                alarm.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(),60 * 1000, pintent);
                                //   String timestamp = intent.getStringExtra("Date");

                            SobhText.setText(Sobh.substring(0, 5));
                            SunriseText.setText(Sunrise.substring(0, 5));
                            ZohrText.setText(Zohr.substring(0, 5));
                            SunsetText.setText(Sunset.substring(0, 5));
                            MaghrebText.setText(Maghreb.substring(0, 5));
                            AsrText.setText(Asr.substring(0, 5));
                            IshaText.setText(Isha.substring(0, 5));

                            Log.d("sobh text .....", SobhText.getText().toString());


                            Log.d("change value before",beforepick+"");
                            Log.d("change value after",afterpick+"");

                            TimeChanging.setOnClickListener(new View.OnClickListener() {
                                    @Override
                                    public void onClick(View v) {

                                       // some code 

                                            Intent intentBA = new Intent(getApplicationContext(), ServiceSetTime.class);
                                            Intent sms = new Intent(getApplicationContext(), SmsService.class);

                                            intentBA.putExtra("SOBH", Sobh.substring(0, 5));
                                            intentBA.putExtra("ZOHR", Zohr.substring(0, 5));
                                            intentBA.putExtra("MAGHREB", Maghreb.substring(0, 5));
                                            intentBA.putExtra("ASR", Asr.substring(0, 5));
                                            intentBA.putExtra("ISHA", Isha.substring(0, 5));

                                            PendingIntent pintentBA = PendingIntent.getService(getApplicationContext(), 0, intentBA, 0);
                                            AlarmManager alarm = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
                                            alarm.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), 30 * 1000, pintentBA);

                                            sms.putExtra("SOBH", Sobh.substring(0, 5));
                                            sms.putExtra("ZOHR", Zohr.substring(0, 5));
                                            sms.putExtra("MAGHREB", Maghreb.substring(0, 5));
                                            sms.putExtra("ASR", Asr.substring(0, 5));
                                            sms.putExtra("ISHA", Isha.substring(0, 5));

                                            PendingIntent pintentsms = PendingIntent.getService(getApplicationContext(), 0, sms, 0);
                                            AlarmManager alarmsms = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
                                            alarmsms.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), 60 * 1000, pintentsms);

                                           // some code
                                });

                        }
                    }, new IntentFilter(ServiceURL.Service)
            );


                }
            });
        }


}


@Override
protected void onResume() {
    super.onResume();
    startService(new Intent(this, ServiceURL.class));
     }

@Override
protected void onPause() {
    super.onPause();
  //  stopService(new Intent(this, ServiceURL.class));

}

注意:由于此处编辑代码可能有些括号不正确,请忽略它们谢谢

【问题讨论】:

    标签: android notifications android-service alarmmanager android-background


    【解决方案1】:

    确保您在退出时没有结束应用程序的进程。使用

    finishAffinity(); 
    

    退出应用程序。

    【讨论】:

    • no :(( 还是一样的,当然就像我之前说的,在某些设备中不是所有的都不能工作,例如在huwaie设备中
    【解决方案2】:

    这取决于设备的型号。如果您从应用程序堆栈中删除应用程序,则不同设备的行为会有所不同。

    一些设备可以停止应用程序,并且不会启动任何警报管理器,但另一台设备仅关闭活动但进程处于活动状态。

    尝试使用https://stackoverflow.com/a/16698105/2930077 来确定进程是否处于活动状态

    【讨论】:

    • 那么,我该怎么做才能在所有设备上工作?你的意思是不可能吗?
    • 是的,如果用户独立停止应用程序,则应用程序无法再次运行,直到用户手动运行。或者您可以尝试注册 ACTION_BOOT_COMPLETED 或收听通知,它可以帮助您再次运行您的应用
    • 当屏幕关闭和触控板激活时出现同样的问题,并且无需用户干预
    • 你用的是哪个安卓版本?在棉花糖版本中,设备可能具有激进的策略,包括打盹模式。设备也可以有有限的后台进程。查看设备设置,电池优化。从 API 19 开始的重复警报是不准确的(查看文档),可以稍后执行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-16
    • 1970-01-01
    • 2016-07-06
    • 1970-01-01
    • 2023-03-03
    • 2021-01-31
    • 1970-01-01
    相关资源
    最近更新 更多