Android 保持应用程序在后台运行
我想让我的应用程序在后台运行Android 保持应用程序在后台运行,android,background,Android,Background,我想让我的应用程序在后台运行 我有一个将用户位置发送到服务器的应用程序 我有以下代码: public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); LocationManager locationManager; String context = Context.LOCATION_SERVIC
我有一个将用户位置发送到服务器的应用程序
我有以下代码:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
LocationManager locationManager;
String context = Context.LOCATION_SERVICE;
locationManager = (LocationManager)getSystemService(context);
Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_FINE);
criteria.setAltitudeRequired(false);
criteria.setBearingRequired(false);
criteria.setCostAllowed(true);
criteria.setPowerRequirement(Criteria.POWER_LOW);
String provider = locationManager.getBestProvider(criteria, true);
updateWithNewLocation(null);
locationManager.requestLocationUpdates(provider, (10*60*1000), 10,
locationListener);
}
private final LocationListener locationListener = new LocationListener() {
public void onLocationChanged(Location location) {
updateWithNewLocation(location);
}
public void onProviderDisabled(String provider){
updateWithNewLocation(null);
}
public void onProviderEnabled(String provider){ }
public void onStatusChanged(String provider, int status,
Bundle extras){ }
};
public void updateWithNewLocation(Location location) {
if (location != null) {
Dbhelper helper = new Dbhelper(this);
final SQLiteDatabase db = helper.getWritableDatabase();
long time = System.currentTimeMillis();
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd kk:mm:ss");
final String curTime = df.format(time);
final double lat = location.getLatitude();
final double lng = location.getLongitude();
final double alt = location.getAltitude();
System.out.println(lat);
System.out.println(lng);
System.out.println(alt);
db.execSQL("INSERT INTO location (longitude,latitude,altitude,tgl_buat) VALUES " +
"('"+lng+"','"+lat+"','"+alt+"','"+curTime+"')");
db.close();
/*Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask(){
@Override
public void run(){
db.execSQL("INSERT INTO location (longitude,latitude,altitude,tgl_buat) VALUES " +
"('121.2149012','-6.217837','0.0','2012-05-07 10:20:01')");
db.close();
}
}, 10*60*1000, 10*60*1000);*/
}
}
我希望我的应用程序在后台运行。我希望它能在手机开机时自动启动对于您的问题,一个非常简单的答案就是使用。它将允许您在后台执行各种任务,是您将位置以静默方式发送到服务器的最佳选择
阅读回答以获取帮助。在
服务中运行您的后台逻辑,如果您想提供良好的用户体验(并且具有更高的优先级),请将通知发布到状态栏(使用通知管理器
)。您可以使用服务让应用程序在后台运行
我希望这对你有帮助
有关更多详细信息,请阅读您应该使用服务
和广播接收器
GrabLocationDetails.java
将此代码用作您的GrabLocationDetails.java
public class GrabLocationDetails extends Service implements LocationListener {
double lat,lng;
private LocationManager locationManager;
private String provider;
boolean isGps;
private ArrayList<String> mList;
Context GLDContext;
public GrabLocationDetails(Context cont){
this.GLDContext=cont;
}
public GrabLocationDetails(){}
@Override
public void onCreate() {
super.onCreate();
mList = new ArrayList<String>();
isGps = false;
lat=0.0;
lng=0.0;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
//super.onStart(intent, startId);
try {
locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
Criteria criteria = new Criteria();
provider = locationManager.getBestProvider(criteria, false);
LocationManager service = (LocationManager) getSystemService(LOCATION_SERVICE);
boolean enabled = service.isProviderEnabled(LocationManager.GPS_PROVIDER);
if (!enabled) {
isGps = false;
ListAddItem(isGps);
SendBroadcast();
} else {
isGps = true;
Location location = locationManager.getLastKnownLocation(provider);
lat=(location.getLatitude());
lng=(location.getLongitude());
ListAddItem(true);
SendBroadcast();
locationManager.requestLocationUpdates(provider, 400, 1, this);
}
} catch (Exception e) {
ListAddItem(isGps);
SendBroadcast();
}
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
super.onDestroy();
//locationManager.removeUpdates(this);
}
public void SendBroadcast(){
Intent broadcastIntent = new Intent();
broadcastIntent.setAction(CommandExecutionModule.LocationDetails);
broadcastIntent.putExtra("Data", mList);
sendBroadcast(broadcastIntent);
}
public void ListAddItem(boolean GPS) {
//if(!GPS)
//mList.add("0");
//else
//mList.add("1");
mList.add(Double.toString(lat));
mList.add(Double.toString(lng));
}
/**************************************************************************************************************/
@Override
public void onLocationChanged(Location location){
locationManager.requestLocationUpdates(provider, 400, 1, this);
mList.clear();
lat = (location.getLatitude());
lng = (location.getLongitude());
ListAddItem(isGps);
SendBroadcast();
locationManager.removeUpdates(this);
stopSelf();
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
locationManager.requestLocationUpdates(provider, 400, 1, this);
}
@Override
public void onProviderEnabled(String provider){
isGps=true;
}
@Override
public void onProviderDisabled(String provider){
isGps=false;
lat=0.0;
lng=0.0;
mList.clear();
ListAddItem(isGps);
//SendBroadcast();
}
公共类GrabLocationDetails扩展服务实现LocationListener{
双lat,液化天然气;
私人场所经理场所经理;
私有字符串提供者;
布尔isGps;
私有数组列表;
语境;
公共抓取位置详细信息(上下文续){
this.GLDContext=cont;
}
public GrabLocationDetails(){}
@凌驾
public void onCreate(){
super.onCreate();
mList=新的ArrayList();
isGps=假;
lat=0.0;
液化天然气=0.0;
}
@凌驾
公共int onStartCommand(Intent Intent、int标志、int startId){
//super.onStart(intent,startId);
试一试{
locationManager=(locationManager)getSystemService(Context.LOCATION\u服务);
标准=新标准();
provider=locationManager.getBestProvider(条件,false);
LocationManager服务=(LocationManager)getSystemService(LOCATION\u服务);
布尔启用=服务.isProviderEnabled(LocationManager.GPS\U提供程序);
如果(!已启用){
isGps=假;
列表附加项(isGps);
发送广播();
}否则{
isGps=真;
Location Location=locationManager.getLastKnownLocation(提供者);
lat=(location.getLatitude());
lng=(location.getLongitude());
ListAddItem(真);
发送广播();
locationManager.requestLocationUpdates(提供者,400,1,this);
}
}捕获(例外e){
列表附加项(isGps);
发送广播();
}
返回super.onStartCommand(intent、flags、startId);
}
@凌驾
公共空间{
super.ondestory();
//locationManager.RemoveUpdate(此);
}
公共广播{
意向广播意向=新意向();
broadcastIntent.setAction(CommandExecutionModule.LocationDetails);
broadcastIntent.putExtra(“数据”,mList);
发送广播(广播意图);
}
公共无效列表附加项(布尔型GPS){
//如果(!GPS)
//列表添加(“0”);
//否则
//列表添加(“1”);
mList.add(双toString(横向));
mList.add(双管柱(液化天然气));
}
/**************************************************************************************************************/
@凌驾
已更改位置上的公共无效(位置){
locationManager.requestLocationUpdates(提供者,400,1,this);
mList.clear();
lat=(location.getLatitude());
lng=(location.getLongitude());
列表附加项(isGps);
发送广播();
locationManager.RemoveUpdate(此);
stopSelf();
}
@凌驾
public void onStatusChanged(字符串提供程序、int状态、Bundle extra){
locationManager.requestLocationUpdates(提供者,400,1,this);
}
@凌驾
公共无效onProviderEnabled(字符串提供程序){
isGps=真;
}
@凌驾
公共无效onProviderDisabled(字符串提供程序){
isGps=假;
lat=0.0;
液化天然气=0.0;
mList.clear();
列表附加项(isGps);
//发送广播();
}
Android中有一个称为服务的组件。Android documnetation说服务是一个应用程序组件,可以在后台执行长时间运行的操作,但不提供用户界面。要自动启动应用程序,可以使用AlarmManager。@Waqas更新答案在哪里?我试图从您的链接中理解,但是我很困惑..我是android新手..我只是按照你链接中的代码或者怎么做?我更新的答案实际上就是我在答案中所做的更新。是的,如果你按照链接的部分进行操作(并根据你的要求进行一点修改),您可以完成此操作。有AppGlobal,我从哪里获得AppGlobal的?将AppGlobal替换为Log。我或者您可以跳过这些行,因为它们用于打印日志。我认为该类(AppGlobal)是那个用户定制的classi我试着编辑了这段代码,但没用你能给我一个简单的代码给新手吗???)谢谢you@deadbabaz你可以很容易地从Android的开发者站点获得服务和广播接收器的代码。在你的调用类中启动此服务并注册广播接收器