Android 何时扩展服务并在后台运行
我有点困惑,在什么地方使用后台任务服务是正确的 这是我的设想: 我有一个扩展广播接收器的类。它接收WiFi状态变化。根据状态的变化,我调用另一个类。这是一个纯Java类,不扩展任何类 该类通过向广播接收器传递接收到的上下文来实例化。 我需要传递上下文,因为除其他外,我访问SharedReferences、显示通知等,但这不是前台活动 这是正确的方法吗?或者我的类应该扩展服务并作为后台任务工作 传递上下文来初始化类是错误的吗 比如说,Android 何时扩展服务并在后台运行,android,background-process,android-context,Android,Background Process,Android Context,我有点困惑,在什么地方使用后台任务服务是正确的 这是我的设想: 我有一个扩展广播接收器的类。它接收WiFi状态变化。根据状态的变化,我调用另一个类。这是一个纯Java类,不扩展任何类 该类通过向广播接收器传递接收到的上下文来实例化。 我需要传递上下文,因为除其他外,我访问SharedReferences、显示通知等,但这不是前台活动 这是正确的方法吗?或者我的类应该扩展服务并作为后台任务工作 传递上下文来初始化类是错误的吗 比如说, public class WifiStateBroadcast
public class WifiStateBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
...
WifiChangeReceptionClass wifiChanged = new WifiChangeReceptionClass(context);
wifiChanged.showNotification();
...
}
这种方法有什么问题?这是错误的,因为只要您使用onReceive方法,上下文引用就可用。一旦调用onReceive方法完成,上下文将不再可用。这是错误的,因为只要您在onReceive方法中,上下文引用就可用。一旦回调onReceive方法完成,上下文将不再可用。只要您在广播接收器的生命周期内使用上下文,就可以将其传递给任何类。由于广播接收器和服务都在UI线程上运行,所以使用服务不会有太大区别
如果您想执行一些网络操作或长时间运行的操作,那么您可以从receiver实例化一个intent service。只要您在广播接收器的生命周期内使用上下文,就可以将其传递给任何类。由于广播接收器和服务都在UI线程上运行,所以使用服务不会有太大区别 如果要执行某些网络操作或长时间运行的操作,则可以从receiver实例化intent service。尝试以下任一操作:
public class WifiChangeReceptionClass{
public static void showNotification(Context context){
//showYourNotification
}
}
或
创建一个应用程序类,该类具有一个静态方法来获取其上下文,如下所示
public class MyApplication extends Application {
...
public static MyApplication get(){
return this;
}
...
}
然后在你的课堂上,打电话:
public class WifiChangeReceptionClass{
public static void showNotification(){
Context context = MyApplication.get();
//showYourNotification
}
}
或
只要用匕首注射你的依赖性。
尝试以下任一方法:
public class WifiChangeReceptionClass{
public static void showNotification(Context context){
//showYourNotification
}
}
或
创建一个应用程序类,该类具有一个静态方法来获取其上下文,如下所示
public class MyApplication extends Application {
...
public static MyApplication get(){
return this;
}
...
}
然后在你的课堂上,打电话:
public class WifiChangeReceptionClass{
public static void showNotification(){
Context context = MyApplication.get();
//showYourNotification
}
}
或
只要用匕首注射你的依赖性。
注册广播接收器以获取Wifi状态更改可能不是因为其已禁用连接\u已更改 针对Android 7.0 API级别24及更高的应用程序,如果在其清单中声明广播接收器,则不会接收连接操作广播。如果应用程序向Context.registerReceiver注册其BroadcastReceiver,并且该上下文仍然有效,则应用程序仍将接收连接操作广播 这包括连接更改。更好的选择是使用JobScheduler。参考此 如响应中所述,BroadcastReceiver的onReceive在主线程上执行。基于dsp的广播接收机
作为一般规则,广播接收器被允许运行长达10秒,然后系统会认为它们没有响应,并重新启动应用程序。由于这些操作通常在应用程序的主线程上执行,因此它们已经受到可能在那里发生的各种操作的~5秒时间限制的限制,更不用说只是避免UI jank,因此接收限制通常不受关注。但是,一旦使用goAsync,尽管可以脱离主线程,但广播执行限制仍然适用,这包括调用此方法到最终Pendingreult.finish之间的时间
如果您的WifiChangeReceiptonClass正在做一些广泛的工作,那么不要直接在OnReceive中运行。相反,启动服务您必须生成一个新的线程或IntentService注册广播接收器以获取Wifi状态更改可能不是由于其已禁用连接而更改 针对Android 7.0 API级别24及更高的应用程序,如果在其清单中声明广播接收器,则不会接收连接操作广播。如果应用程序向Context.registerReceiver注册其BroadcastReceiver,并且该上下文仍然有效,则应用程序仍将接收连接操作广播 这包括连接更改。更好的选择是使用JobScheduler。参考此 如响应中所述,BroadcastReceiver的onReceive在主线程上执行。基于dsp的广播接收机
作为一般规则,广播接收器被允许运行长达10秒,然后系统会认为它们没有响应,并重新启动应用程序。由于这些操作通常在应用程序的主线程上执行,因此它们已经受到可能在那里发生的各种操作的~5秒时间限制的限制,更不用说只是避免UI jank,因此接收限制通常不受关注。但是,一旦您使用goAsync,尽管可以关闭 在主线程中,广播执行限制仍然适用,这包括调用此方法和最终Pendingreult.finish之间的时间
如果您的WifiChangeReceiptonClass正在做一些广泛的工作,那么不要直接在OnReceive中运行。相反,启动服务您必须生成一个新线程或IntentService谢谢。好啊但是如果showNotification返回呢?意思是,上下文的使用将在onReceive中。要在整个应用程序中获取上下文,您可以使用此链接,谢谢。好啊但是如果showNotification返回呢?意思是,上下文的使用将在onReceive中。要在整个应用程序中获取上下文,您可以使用此链接,谢谢。是的,函数返回onReceive。谢谢。是的,函数返回onReceive。这对我来说是新信息。谢谢萨加尔。@madu:没问题。这对我来说是新信息。谢谢萨加尔。@madu:没问题。这救了我的饭碗。。谢谢!这救了我的饭碗。。谢谢!