Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 何时扩展服务并在后台运行_Android_Background Process_Android Context - Fatal编程技术网

Android 何时扩展服务并在后台运行

Android 何时扩展服务并在后台运行,android,background-process,android-context,Android,Background Process,Android Context,我有点困惑,在什么地方使用后台任务服务是正确的 这是我的设想: 我有一个扩展广播接收器的类。它接收WiFi状态变化。根据状态的变化,我调用另一个类。这是一个纯Java类,不扩展任何类 该类通过向广播接收器传递接收到的上下文来实例化。 我需要传递上下文,因为除其他外,我访问SharedReferences、显示通知等,但这不是前台活动 这是正确的方法吗?或者我的类应该扩展服务并作为后台任务工作 传递上下文来初始化类是错误的吗 比如说, public class WifiStateBroadcast

我有点困惑,在什么地方使用后台任务服务是正确的

这是我的设想:

我有一个扩展广播接收器的类。它接收WiFi状态变化。根据状态的变化,我调用另一个类。这是一个纯Java类,不扩展任何类

该类通过向广播接收器传递接收到的上下文来实例化。 我需要传递上下文,因为除其他外,我访问SharedReferences、显示通知等,但这不是前台活动

这是正确的方法吗?或者我的类应该扩展服务并作为后台任务工作

传递上下文来初始化类是错误的吗

比如说,

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:没问题。这救了我的饭碗。。谢谢!这救了我的饭碗。。谢谢!