RN服务
https://facebook.github.io/react-native/docs/headless-js-android.html
当app在 后台运行 时,我们可以使用RN服务来同时地刷新数据、推送或者播放音乐。
JS API
在JS中注册一个后台任务(不能操作UI,一般是网络请求、定时器等)
AppRegistry.registerHeadlessTask('SomeTaskName', () => require('SomeTaskName'));
// SomeTaskName.js:
module.exports = async (taskData) => {
// do stuff
};
Java API
定义一个服务类,继承HeadlessJsTaskService
public class MyTaskService extends HeadlessJsTaskService {
@Override
protected @Nullable HeadlessJsTaskConfig getTaskConfig(Intent intent) {
Bundle extras = intent.getExtras();
if (extras != null) {
return new HeadlessJsTaskConfig(
"SomeTaskName",
Arguments.fromBundle(extras),
5000, // timeout for the task
false // optional: defines whether or not the task is allowed in foreground. Default is false
);
}
return null;
}
}
在清单文件中声明这个服务
<service android:name="com.example.MyTaskService" />
在Java中开启这个服务
Intent service = new Intent(getApplicationContext(), MyTaskService.class);
Bundle bundle = new Bundle(); bundle.putString("foo", "bar");
service.putExtras(bundle); getApplicationContext().startService(service);
警告
- 默认情况下,当app前台运行时,开启这个服务会导致app崩溃。这是为了防止app在展示界面的同时运行大量的后台工作,可以通过第四个参数来改变这种行为(默认为false,不允许任务在前台运行)
- 如果从广播接收者中开启服务,必须保证在onReceive结束前调用HeadlessJsTaskService.aquireWakeLockNow()
例子
这是一个可以响应网络连接变化的例子。首先在清单文件中配置广播接收者
<receiver android:name=".NetworkChangeReceiver" >
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter>
</receiver>
广播接收者在onReceive中处理广播,可以在这里检查app是否运行在前台:
public class NetworkChangeReceiver extends BroadcastReceiver {
@Override
public void onReceive(final Context context, final Intent intent) {
/**
This part will be called everytime network connection is changed
e.g. Connected -> Not Connected
**/
if (!isAppOnForeground((context))) {
/**
We will start our service and send extra info about
network connections
**/
boolean hasInternet = isNetworkAvailable(context);
Intent serviceIntent = new Intent(context, MyTaskService.class);
serviceIntent.putExtra("hasInternet", hasInternet);
context.startService(serviceIntent);
HeadlessJsTaskService.acquireWakeLockNow(context);
}
}
private boolean isAppOnForeground(Context context) {
/**
We need to check if app is in foreground otherwise the app will crash.
http://stackoverflow.com/questions/8489993/check-android-application-is-in-foreground-or-not
**/
ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningAppProcessInfo> appProcesses =
activityManager.getRunningAppProcesses();
if (appProcesses == null) {
return false;
}
final String packageName = context.getPackageName();
for (ActivityManager.RunningAppProcessInfo appProcess : appProcesses) {
if (appProcess.importance ==
ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND &&
appProcess.processName.equals(packageName)) {
return true;
}
}
return false;
}
public static boolean isNetworkAvailable(Context context) {
ConnectivityManager cm = (ConnectivityManager)
context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo netInfo = cm.getActiveNetworkInfo();
return (netInfo != null && netInfo.isConnected());
}
}
实践
测试发现必须要多加一个权限:
<uses-permission android:name="android.permission.WAKE_LOCK"/>
对于以下代码:
module.exports = async (taskData) => {
await getData()
await getData()
await getData()
await getData()
await getData()
await getData()
};
function getData(){
return new Promise((resolve)=>{
setTimeout(()=>{
console.log("get data from server")
resolve(1)
},5000)
});
}
当设置允许运行在前台时(allowedInForeground=true),前台或者后台开启服务都没问题,只是只要app进入后台,以上的代码就会被暂停,恢复前后后继续执行。
当不允许前台运行时,前台开启服务则闪退,后台开启不会。后台开启后,仅仅执行了一个promise,就暂停了,恢复前台后剩余的代码继续执行,再次进入后台,则代码暂停,恢复前后剩余代码继续执行。
以上运行的环境是夜神模拟器,还没到真机上测试。
RN服务的更多相关文章
- react native初步常见问题
首先按照资料一步步搭建环境运行,然后成功了,很激动,可是,安卓就是没这么容易成功,还是太年轻了 could not get batchedbridge, make sure your bundle i ...
- React Native 之 main.jsbundle生成方法
通过react-native init yooweiProject 生成的RN项目(版本基于0.57),目录结构如下 项目结构: 大家可以发现main.jsbundle 是红色的,不存在的,这个属于正 ...
- RN 数据持久化存储服务API
一些数据信息需要存储在手机内存中,比如用户的登录名密码 token啥的,所以这就需要了来存这些信息 在RN中 采用了AsyncStorage是一个简单的.异步的.持久化的Key-Value存储系统,它 ...
- 使用dubbo分布式服务框架发布服务及消费服务
什么是DUBBO DUBBO是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案. 准备工作 安装zookeeper ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服 ...
- C# 自动Ping服务
using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; u ...
- 5. 网络配置与FTP服务笔记
IP地址: Ipv4 2*32 Ipv6 tcp 网络通讯协议 udp 用户数据报协议 常见网络端口: 20 21 ftp服务 文件共享 22 ...
- 客户端向服务端传送特殊字符解决方法(检测到有潜在危险的 Request.Form 值)
当客户端向服务端传输特殊字符时报错,错误信息如下图:
- Nginx/Apache服务连接数梳理
统计连接数,使用netstat命令或ss命令都可以1)统计连接数(80端口)[root@wang ~]# netstat -nat|grep -i "80"|wc -l872 或者 ...
- django中“url映射规则”和“服务端响应顺序”
1.django搜索路径 使用 import 语句时,Python 所查找的系统目录清单. 查看方式: import sys print sys.path ...
随机推荐
- Android近场通信---NFC基础(四)(转)
转自http://blog.csdn.net/think_soft/article/details/8184539 从Intent中获取信息 如果因为NFC的Intent而启动一个Activity,那 ...
- RDS 导出Mysqlbinlog_二进制日志
1:首先进入RDS后台查看Mysqlbin_log日志,可以通过以下命令进行查看: show master logs; 或 show binary logs; 2:比如我们获取的是:mysql-bin ...
- 如何用dos命令结束进程
ntsd 是一条dos命令,功能是用于结束一些常规下结束不了的死进程. 用法为打开cmd 后输入以下命令就可以结束进程: 方法一:利用进程的PID结束进程 命令格式:ntsd -c q -p pid ...
- 爬虫scrapy框架之CrawlSpider
爬虫scrapy框架之CrawlSpider 引入 提问:如果想要通过爬虫程序去爬取全站数据的话,有几种实现方法? 方法一:基于Scrapy框架中的Spider的递归爬取进行实现(Request模 ...
- ZOJ3329(数学推导+期望递推)
要点: 1.期望的套路,要求n以上的期望,则设dp[i]为i分距离终点的期望步数,则终点dp值为0,答案是dp[0]. 2.此题主要在于数学推导,一方面是要写出dp[i] = 什么,虽然一大串但是思维 ...
- 19 标签:xml或者html
1 标签:xml或者html 1.1 使用XmlSlurper解析xml groovy处理xml非常容易.XmlSlurper 类用来处理xml.在处理xml方面,还有其他的处理方式,但 ...
- 关于css中父元素与子元素之间margin-top的问题
之前在使用经常遇到下面的问题: html: <div class="top"> <div class="one">I'm the fir ...
- JavaMailSender怎么发送163和qq邮件
https://blog.csdn.net/Tracycater/article/details/73441010 引入Maven依赖包 <dependency> <groupId& ...
- elasticsearch的模糊查询
https://blog.csdn.net/a772304419/article/details/78951561
- 灰度共生矩阵GLCM分析
纹理分析是对图像灰度(浓淡)空间分布模式的提取和分析.纹理分析在遥感图像.X射线照片.细胞图像判读和处理方面有广泛的应用.关于纹理,还没有一个统一的数学模型.它起源于表征纺织品表面性质的纹理概念,可以 ...