如何在后台运行android应用程序[重复]
Posted
技术标签:
【中文标题】如何在后台运行android应用程序[重复]【英文标题】:How to run android application in background [duplicate] 【发布时间】:2012-09-06 02:56:15 【问题描述】:可能重复:how to run application in background in android?
如果我的位置纬度和经度等于数据库移动配置文件中的相同位置,我正在使用位置管理器进行项目应该进入静默模式。所以我需要使用位置管理器继续更新我的位置。我做到了。但是如果我关闭我的应用程序它不起作用。 但是即使我关闭了我的应用程序,我的应用程序也应该可以工作。我在关闭应用程序时尝试了异步任务,但是在我手动切换到响亮模式后,它不会变为静音。当我的应用程序在后台运行时,我也应该收到通知..请提前帮助.tks
这是我的代码
public class ShowLocationActivity extends Activity implements LocationListener
private TextView latituteField;
private TextView longitudeField;
private LocationManager locationManager;
private String provider;
double lat,lng;
Location location;
AudioManager mobilemode ;
private Boolean flag = false;
@Override
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.location);
latituteField = (TextView) findViewById(R.id.TextView02);
longitudeField = (TextView) findViewById(R.id.TextView04);
mobilemode = (AudioManager) this.getSystemService(Context.AUDIO_SERVICE);
// Get the location manager
locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
// Define the criteria how to select the locatioin provider -> use
// default
Criteria criteria = new Criteria();
provider = locationManager.getBestProvider(criteria, false);
location = locationManager.getLastKnownLocation(provider);
// Initialize the location fields
flag = displayGpsStatus();
if (flag)
if (location != null)
System.out.println("Provider " + provider + " has been selected.");
onLocationChanged(location);
if((lat==12.905478)&&(lng==80.093358))
mobilemode.setRingerMode(AudioManager.RINGER_MODE_VIBRATE);
Toast.makeText(getBaseContext(),"VIBRATE profile activated ",Toast.LENGTH_SHORT).show();
else if ((lat==12.90080625)&&(lng==80.09210655))
mobilemode.setRingerMode(AudioManager.RINGER_MODE_SILENT);
Toast.makeText(getBaseContext(),"SILENT profile activated !",Toast.LENGTH_SHORT).show();
//notification.setLatestEventInfo(ShowLocationActivity.this, "changed to silent mode", "because u r in office", pendingIntent);
// notificationManager.notify(i, notification);
else
mobilemode.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
Toast.makeText(getBaseContext(),"LOUD profile activated !",Toast.LENGTH_SHORT).show();
else
latituteField.setText("Location not available");
longitudeField.setText("Location not available");
else
alertbox("Gps Status!!", "Your GPS is: OFF");
@Override
public boolean onCreateOptionsMenu(Menu menu)
getMenuInflater().inflate(R.menu.location, menu);
return true;
public boolean onOptionsItemSelected(MenuItem item)
// Handle item selection
switch (item.getItemId())
case R.id.menu_settings:
Intent intent = new Intent( ShowLocationActivity.this,SetPreference.class);
startActivityForResult(intent, 0);
checkPref();
return true;
default:
return super.onOptionsItemSelected(item);
private void checkPref()
SharedPreferences myPref
= PreferenceManager.getDefaultSharedPreferences(ShowLocationActivity.this);
String _pref =
"Option 1: " + myPref.getBoolean("pref_opt1", true);
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
// TODO Auto-generated method stub
super.onActivityResult(requestCode, resultCode, data);
checkPref();
@Override
public void onLocationChanged(Location location)
// TODO Auto-generated method stub
lat = (double) (location.getLatitude());
lng = (double) (location.getLongitude());
latituteField.setText(String.valueOf(lat));
longitudeField.setText(String.valueOf(lng));
@Override
public void onProviderDisabled(String provider)
// TODO Auto-generated method stub
Toast.makeText(this, "Disabled provider " + provider,
Toast.LENGTH_SHORT).show();
@Override
public void onProviderEnabled(String provider)
// TODO Auto-generated method stub
Toast.makeText(this, "Enabled new provider " + provider,
Toast.LENGTH_SHORT).show();
@Override
public void onStatusChanged(String provider, int status, Bundle extras)
// TODO Auto-generated method stub
@Override
protected void onResume()
super.onResume();
locationManager.requestLocationUpdates(provider, 400, 1, this);
@Override
protected void onPause()
super.onPause();
locationManager.removeUpdates(this);
public void rrr(View v)
DownloadTask n= new DownloadTask();
n.doInBackground();
public void onDestroy()
super.onDestroy();
Log.v("hhh","on destroy");
DownloadTask n= new DownloadTask();
n.doInBackground();
public Boolean displayGpsStatus()
ContentResolver contentResolver = getBaseContext().getContentResolver();
boolean gpsStatus = Settings.Secure.isLocationProviderEnabled(
contentResolver, LocationManager.GPS_PROVIDER);
if (gpsStatus)
return true;
else
return false;
/*----------Method to create an AlertBox ------------- */
protected void alertbox(String title, String mymessage)
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage("Your Device's GPS is Disable")
.setCancelable(false)
.setTitle("** Gps Status **")
.setPositiveButton("Gps On",
new DialogInterface.OnClickListener()
public void onClick(DialogInterface dialog, int id)
// finish the current activity
// AlertBoxAdvance.this.finish();
Intent myIntent = new Intent(
Settings.ACTION_LOCATION_SOURCE_SETTINGS);
startActivity(myIntent);
dialog.cancel();
)
.setNegativeButton("Cancel",
new DialogInterface.OnClickListener()
public void onClick(DialogInterface dialog, int id)
// cancel the dialog box
dialog.cancel();
);
AlertDialog alert = builder.create();
alert.show();
public class DownloadTask extends AsyncTask<Integer, Integer, Void>
@Override
protected Void doInBackground(Integer... params)
Log.v("hhh","back");
onCreate(null);
// onLocationChanged(location);
/*
lat = (double) (location.getLatitude());
lng = (double) (location.getLongitude());
latituteField.setText(String.valueOf(lat));
longitudeField.setText(String.valueOf(lng));
if (location != null)
System.out.println("Provider " + provider + " has been selected.");
onLocationChanged(location);
if((lat==12.905478)&&(lng==80.093358))
mobilemode.setRingerMode(AudioManager.RINGER_MODE_VIBRATE);
Toast.makeText(getBaseContext(),"VIBRATE profile activated ",Toast.LENGTH_SHORT).show();
else if ((lat==12.90080625)&&(lng==80.09210655))
mobilemode.setRingerMode(AudioManager.RINGER_MODE_SILENT);
Toast.makeText(getBaseContext(),"SILENT profile activated !",Toast.LENGTH_SHORT).show();
//notification.setLatestEventInfo(ShowLocationActivity.this, "changed to silent mode", "because u r in office", pendingIntent);
// notificationManager.notify(i, notification);
else
mobilemode.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
Toast.makeText(getBaseContext(),"LOUD profile activated !",Toast.LENGTH_SHORT).show();
else
latituteField.setText("Location not available");
longitudeField.setText("Location not available");
// TODO Auto-generated method stub
*/
return null;
【问题讨论】:
用户 Android 组件名为 Service 这个问题可能会回答你在寻找什么***.com/questions/5240246/… 【参考方案1】:你已经在Activity中编码了,建议你改成Android Service。服务是在后台运行的组件,不与用户交互。
看看 Vogella 的 Service Example。
只需将您的 Activity 代码转换为 Android 服务,它就可以在后台运行,无需任何 GUI。
【讨论】:
是的服务方法有效。但我们也应该使用广播接收器将有关位置的更新从服务发送到活动 即使这样也可以在后台运行。我也一样。以上是关于如何在后台运行android应用程序[重复]的主要内容,如果未能解决你的问题,请参考以下文章