Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/217.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
Java Android-位置服务不在后台运行,仅在连接到计算机时运行_Java_Android_Service_Locationmanager_Locationlistener - Fatal编程技术网

Java Android-位置服务不在后台运行,仅在连接到计算机时运行

Java Android-位置服务不在后台运行,仅在连接到计算机时运行,java,android,service,locationmanager,locationlistener,Java,Android,Service,Locationmanager,Locationlistener,我创建了一个具有LocationListener的服务。 在片段中,我有一个BroadcastReceiver,它成功地从服务接收位置信息。当手机连接到我的电脑,并且我按下“运行”(非调试模式)时,一切正常。当手机屏幕关闭时,我会不断收到位置信息,正如我在Android Studio的“Run”控制台中看到的那样 但是,当我断开手机与电脑的连接并关闭屏幕时,我停止接收位置更新。或者在它停止之前我只得到了一两个位置更新。然后,当再次打开屏幕时,服务开始发送位置更新 我曾尝试在片段和服务上使用Wak

我创建了一个具有LocationListener的服务。 在片段中,我有一个BroadcastReceiver,它成功地从服务接收位置信息。当手机连接到我的电脑,并且我按下“运行”(非调试模式)时,一切正常。当手机屏幕关闭时,我会不断收到位置信息,正如我在Android Studio的“Run”控制台中看到的那样

但是,当我断开手机与电脑的连接并关闭屏幕时,我停止接收位置更新。或者在它停止之前我只得到了一两个位置更新。然后,当再次打开屏幕时,服务开始发送位置更新

我曾尝试在片段和服务上使用WakeLock,但似乎没有任何效果

有人能帮帮我吗!?…:,(

在我的服务中,我在putExtra()中设置了一个ArrayList->String,它包含一个纬度和一个时间戳,这样我就可以看到locationlistener在屏幕锁定时是否更新了位置。在片段中,我在视图中显示结果,这样我就可以手动调试

这是我的服务代码:

public class GpsService extends Service {

private LocationListener listener;
private LocationManager locationManager;
private Intent mIntent;

private ArrayList<String> latTimeArrayList = new ArrayList<>();

private PowerManager.WakeLock wakeLock;

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    super.onStartCommand(intent, flags, startId);
    mIntent = new Intent("location_update");

    PowerManager mgr = (PowerManager) getSystemService(Context.POWER_SERVICE);
    wakeLock = mgr.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyWakeLock");
    wakeLock.acquire();

    return START_NOT_STICKY;
}

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

@Override
public void onCreate() {

    locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

    listener = new LocationListener() {
        @Override
        public void onLocationChanged(Location location) {

            mIntent.putExtra("Latitude", location.getLatitude());
            mIntent.putExtra("Longitude", location.getLongitude());

            if(latTimeArrayList.size() < 10){

                latTimeArrayList.add(location.getLatitude() + " -> " + new Date());

            }else if(latTimeArrayList.size() == 10){
                mIntent.putExtra("latTimeArray", latTimeArrayList);
            }
            sendBroadcast(mIntent);
        }

        @Override
        public void onStatusChanged(String s, int i, Bundle bundle) {

        }

        @Override
        public void onProviderEnabled(String s) {

        }

        @Override
        public void onProviderDisabled(String s) {

        }
    };

    //noinspection MissingPermission
    locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 100, 0, listener);
    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 100, 0, listener);

}

@Override
public void onDestroy() {
    super.onDestroy();
    if(locationManager != null){
        //noinspection MissingPermission
        locationManager.removeUpdates(listener);
        wakeLock.release();
    }
}
公共类GpsService扩展服务{
私密地点监听;
私人场所经理场所经理;
私人意图;
私有ArrayList latTimeArrayList=新ArrayList();
私有PowerManager.WakeLock WakeLock;
@凌驾
公共int onStartCommand(Intent Intent、int标志、int startId){
super.onStartCommand(intent、flags、startId);
MINENT=新意图(“位置更新”);
PowerManager-mgr=(PowerManager)getSystemService(Context.POWER\u服务);
wakeLock=mgr.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,“MyWakeLock”);
wakeLock.acquire();
返回开始时间不粘;
}
@可空
@凌驾
公共IBinder onBind(意向){
返回null;
}
@凌驾
public void onCreate(){
locationManager=(locationManager)getSystemService(Context.LOCATION\u服务);
listener=新位置listener(){
@凌驾
已更改位置上的公共无效(位置){
putExtra(“纬度”,location.getLatitude());
putExtra(“经度”,location.getLongitude());
if(latTimeArrayList.size()<10){
添加(location.getLatitude()+“->”+新日期());
}else if(latTimeArrayList.size()=10){
Minent.putExtra(“latTimeArray”,latTimeArrayList);
}
发送广播(MINENT);
}
@凌驾
状态已更改的公共void(字符串s、int i、Bundle){
}
@凌驾
已提供已启用的公共void(字符串s){
}
@凌驾
公共无效onProviderDisabled(字符串s){
}
};
//不允许检查
locationManager.RequestLocationUpdate(locationManager.NETWORK_提供程序,100,0,侦听器);
locationManager.RequestLocationUpdate(locationManager.GPS_提供程序,100,0,侦听器);
}
@凌驾
公共空间{
super.ondestory();
如果(locationManager!=null){
//不允许检查
locationManager.RemoveUpdate(侦听器);
wakeLock.release();
}
}
}

专用广播接收机;
ArrayList aString=新的ArrayList();
私有字符串mmtext=“”;
TextView-debugtext=(TextView)mView.findViewById(R.id.hasCompletedTrack);
int-doagain=0;
@凌驾
恢复时公开作废(){
super.onResume();
if(broadcastReceiver==null){
broadcastReceiver=新的broadcastReceiver(){
@凌驾
公共void onReceive(上下文、意图){
试一试{
if(doagain==0){
aString=(ArrayList)intent.getExtras().get(“latTimeArray”);
if(aString!=null | | aString.size()!=0){
对于(int i=0;i
我找到了答案

我不得不在三星Galaxy S6 edge上关闭电源保存模式

另外,在my
broadcastReceiver=new broadcastReceiver()中{
@凌驾
public void onReceive(上下文、意图){

在我的片段中,我使用
Intent getExtra()
(这不在我发布的代码中)对从我的服务中获得的每个位置更新进行了一些位置计算。但是onReceive()仅在屏幕打开(未锁定)时才会触发因此,我在碎片中的计算从未被触发,只有在屏幕上触发计算方法时才被触发

我的解决方案是直接在我的服务中处理所有的计算

private BroadcastReceiver broadcastReceiver;
ArrayList<String> aString = new ArrayList<>();
private String mmtext = "";
TextView debugtext = (TextView) mView.findViewById(R.id.hasCompletedTrack);
int doagain = 0;
@Override
public void onResume() {
    super.onResume();

    if(broadcastReceiver == null){
        broadcastReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                try{
                    if (doagain == 0){
                        aString = (ArrayList<String>)intent.getExtras().get("latTimeArray");
                        if(aString != null || aString.size() != 0){

                            for (int i =0; i< aString.size(); i++){
                                mmtext += aString.get(i) + "\n";
                            }
                            doagain = 1;
                            debugtext.setText(mmtext);
                        }
                    }


                }catch(NullPointerException e){}