您可以实现低于 N 的应用内定位。
在 AndroidManifest.xml 中,您必须添加以下权限。
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
这是您在 manfest 文件中的接收器。
<receiver android:name=".NetworkStateReceiver" >
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter>
</receiver>
这是你的广播接收器
public class NetworkStateReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if(isDeviceOnline()){
}
}
private boolean isDeviceOnline() {
ConnectivityManager connMgr =
(ConnectivityManager) Collect.getInstance().getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
return networkInfo != null && networkInfo.isConnected();
}
但是对于面向 N 及更高版本的应用,不推荐为 android.net.conn.CONNECTIVITY_CHANGE 声明广播接收器。
通常,应用程序不应依赖此广播,而应使用 JobScheduler 或 GCMNetworkManager。
此问题标记 * 对电池寿命产生负面影响的代码,或 * 使用最近更改行为的 API 来防止后台任务过度消耗内存和电池。
通常,您应该改用 JobScheduler 或 GcmNetworkManager。
有关如何更新代码的更多详细信息,
更多信息
在未计量的连接上安排网络作业
使用 JobInfo.Builder 类构建 JobInfo 对象时,应用 setRequiredNetworkType() 方法并将 JobInfo.NETWORK_TYPE_UNMETERED 作为作业参数传递。以下代码示例安排服务在设备连接到未计量的网络并正在充电时运行:
public static final int MY_BACKGROUND_JOB = 0;
...
public static void scheduleJob(Context context) {
JobScheduler js =
(JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
JobInfo job = new JobInfo.Builder(
MY_BACKGROUND_JOB,
new ComponentName(context, MyJobService.class))
.setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED)
.setRequiresCharging(true)
.build();
js.schedule(job);
}
在此处查找更多详细信息