简体   繁体   English

让应用始终在 Android 的后台运行

[英]Keep app running in background on Android all the time

I have to get people's trajectory (from home to job, for example), so my app gets latitude and longitude (I have two buttons: 1. Start to get lat and lon 2. Stop to get lat and lon).我必须获取人们的轨迹(例如从家到工作),因此我的应用程序获取纬度和经度(我有两个按钮:1. 开始获取纬度和经度 2. 停止获取纬度和经度)。 However, I want that android does not kill the app, I want to keep my application running while the user use facebook, twitter (for example) or simply the user locks his smartphone.但是,我希望 android 不会终止应用程序,我希望在用户使用 facebook、twitter(例如)或只是用户锁定他的智能手机时保持我的应用程序运行。 My app works fine when user use the app while using facebook or twitter (for example), but when I lock my smartphone, Android kill the app.当用户在使用 facebook 或 twitter(例如)时使用该应用程序时,我的应用程序运行良好,但是当我锁定我的智能手机时,Android 会终止该应用程序。 I have tried to use intentservice and service, but they do not work when I lock the screen.我曾尝试使用 intentservice 和 service,但是当我锁定屏幕时它们不起作用。 Should I use PowerManager.WakeLock?我应该使用 PowerManager.WakeLock 吗? I do not exactly know how it works and what it does.我不完全知道它是如何工作的以及它的作用。

This is an example that I made to try services, I don't know if I am wrong, but it does not work when: 1. I am in the app (I have started the service) 2. I tap home button (while service is running) 3. I lock screen.这是我尝试服务的一个例子,我不知道我是否错了,但它在以下情况下不起作用:1.我在应用程序中(我已经启动了服务)2.我点击主页按钮(同时服务正在运行) 3. 我锁定屏幕。 4. Then the service and the app are killed by android (and the service did not finished to do its stuff) 4.然后服务和应用程序被android杀死(服务没有完成它的东西)

Manifest显现

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.javosoft.intentservice">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <service android:name=".MyService"
            android:exported="false"></service>

    </application>

</manifest>

activity_main活动主

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.javosoft.intentservice.MainActivity">

    <Button
        android:text="start Service"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="63dp"
        android:id="@+id/button"
        android:onClick="startService"/>

    <Button
        android:text="Stop Service"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignLeft="@+id/button"
        android:layout_alignStart="@+id/button"
        android:layout_marginBottom="68dp"
        android:id="@+id/button2"
        android:onClick="stopService" />

    <EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:inputType="textPersonName"
        android:hint="textito :D"
        android:ems="10"
        android:layout_centerVertical="true"
        android:layout_centerHorizontal="true"
        android:id="@+id/editText" />
</RelativeLayout>

布局

MainActivity主要活动

package com.javosoft.intentservice;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {

    private Button button;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        button = (Button) findViewById(R.id.button);

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(MainActivity.this, MyService.class);
                startService(intent);
            }
        });

    }

    public void stopService (View view){
        Intent intent = new Intent(this, MyService.class);
        stopService(intent);
    }
}

MyService class我的服务类

package com.javosoft.intentservice;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.support.annotation.Nullable;
import android.util.Log;
import android.widget.Toast;

public class MyService extends Service {

    final class MyThreadClass implements Runnable{

        int service_id;
        MyThreadClass(int service_id){
            this.service_id = service_id;
        }

        @Override
        public void run() {

            synchronized (this){
                int count = 0;
                while (count < 10){
                    Log.i("servicio", "while: " + String.valueOf(count));
                    try {
                        wait(2000);
                        count++;
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
            stopSelf(service_id);

        }
    }

    @Override
    public void onCreate() {
        super.onCreate();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Toast.makeText(this, "El servició ha empezado D:", Toast.LENGTH_SHORT).show();
        Log.i("servicio", "El servició ha empezado D:");


        Log.i("servicio", "onStartCommand arriba");

        Thread thread = new Thread(new MyThreadClass(startId));
        thread.start();

        Log.i("servicio", "onStartCommand abajo");
        return START_STICKY;
        //return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public void onDestroy() {
        //super.onDestroy();
        Toast.makeText(this, "El servicio ha padarado ._.", Toast.LENGTH_SHORT).show();
        Log.i("servicio", "El servicio ha padarado ._.");
    }

    //@Nullable
    @Override
    public IBinder onBind(Intent intent) {

        return null;

    }
}

Try our this试试我们的这个

public class ForegroundService extends Service {
    private static final String LOG_TAG = "ForegroundService";

    @Override
    public void onCreate() {
        super.onCreate();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {

        // Your logical code here

        return START_STICKY;
    }

    @Override
    public void onTaskRemoved(Intent rootIntent) {

        //When remove app from background then start it again
        startService(new Intent(this, ForegroundService.class));

        super.onTaskRemoved(rootIntent);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.i(LOG_TAG, "In onDestroy");
    }

    @Override
    public IBinder onBind(Intent intent) {
        // Used only in case of bound services.
        return null;
    }
}

On Start button click:在开始按钮上单击:

Intent startIntent = new Intent(MainActivity.this, ForegroundService.class);
    startService(startIntent);

In Manifest在清单中

<service
            android:name=".ForegroundService"
            android:enabled="true"
            android:stopWithTask="false" />

I've read that some smartphones have these kind of problems, I found that Huawei, Xiaomi among others have problems with implementation Services, and guess what: My smartphone is a Huawei.我读过一些智能手机存在此类问题,我发现华为、小米等在实施服务方面存在问题,猜猜看:我的智能手机是华为。 The problem comes out of programs preinstalled on these devices for energy saving.问题出在这些设备上预装的节能程序。 Therefore, I tried to run my program on a Nexus (simulator for this one), a Sony and a Moto G, the program ran well for these 3 devices.因此,我尝试在 Nexus(此模拟器)、Sony 和 Moto G 上运行我的程序,该程序在这 3 台设备上运行良好。 Thanks for help.感谢帮助。

As @Gudin says, it looks to me like you stop the service after 20 seconds.正如@Gudin 所说,在我看来,您在 20 秒后停止服务。 However, since you say this works sometimes, I'm guessing that's just some test code.但是,由于您说这有时有效,我猜这只是一些测试代码。 I suspect your problem is in how you start the Service.我怀疑您的问题在于您如何启动服务。 Passing the Activity's context means your Service is tied to the lifecycle of that Activity.传递活动的上下文意味着您的服务与该活动的生命周期相关联。 If that is destroyed, I think your Service goes with it.如果它被破坏了,我认为你的服务会随之而来。 (Simply going through onStop() of the Activity & not onDestroy() leaves the Service intact). (简单地通过 Activity 的onStop()而不是onDestroy()使 Service 完好无损)。 Try this尝试这个

    Intent intent = new Intent(getApplicationContext(), MyService.class);

I tried duplicating your problem but couldn't so I can't say for sure this is your problem.我尝试复制你的问题,但不能,所以我不能肯定这是你的问题。 This is a good place to start though.不过,这是一个很好的起点。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM