让Android上的应用程序始终在后台运行 [英] Keep app running in background on Android all the time
问题描述
我必须得到人们的轨迹(例如,从家到工作),所以我的应用获得经度和经度(我有两个按钮:1。开始获得lat和lon 2.停止获得lat和lon)。但是,我希望android不会杀死应用程序,我希望保持我的应用程序运行,而用户使用Facebook,Twitter(例如)或只是用户锁定他的智能手机。
我的应用程序在用户使用Facebook或推特(例如)时使用该应用程序正常,但当我锁定我的智能手机时,Android会杀死该应用程序。
我试图使用intentservice和service,但是当我锁定屏幕时它们不起作用。我应该使用PowerManager.WakeLock吗?我不知道它是如何工作的以及它的作用。
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). 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. 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. I have tried to use intentservice and service, but they do not work when I lock the screen. Should I use PowerManager.WakeLock? I do not exactly know how it works and what it does.
这是我尝试服务的一个例子,我不知道我错了,但是它在以下情况下不起作用:
1.我在应用程序中(我已启动服务)
2.我点击主页按钮(服务正在运行时)
3.我锁屏。
4.然后服务和应用程序被android杀死(服务没有完成它的东西)
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. 4. Then the service and the app are killed by android (and the service did not finished to do its stuff)
清单
<?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
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
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类
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;
}
}
推荐答案
试试我们的这个
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;
}
}
点击开始按钮:
Intent startIntent = new Intent(MainActivity.this, ForegroundService.class);
startService(startIntent);
在清单中
<service
android:name=".ForegroundService"
android:enabled="true"
android:stopWithTask="false" />
这篇关于让Android上的应用程序始终在后台运行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!