2012-09-13 34 views
7

可能重复:
how to run application in background in android?如何在后台运行Android应用程序

我使用外景经理做项目,如果我的位置的经度和纬度等于这是在数据库中移动相同配置文件应该进入静音mode.so我需要继续更新我的位置使用位置manager.i做到了。但如果我关闭我的应用程序它不工作。 但我的应用程序应该工作,即使我关闭我的app.i尝试与异步任务其工作时,我关闭应用程序,但后我手动切换到响亮模式它不会改变silent.i应该也会得到通知时,我的应用程序运行n提前

background..please help.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; 
     } 
} 
} 
+3

用户Android组件调用[Service](http://developer.android.com/reference/android/app/Service.html) – Lucifer

+0

此问题可能会回答你在找什么http://stackoverflow.com/questions/5240246/broadcastreceiver-for-location –

回答

11

您在活动已编码的,我建议你把它改为Android Service。服务是一个在后台运行的组件,不需要与用户交互。

看看Vogella的Service Example

只需将您的活动代码转换为Android服务,它将在没有任何GUI的情况下在后台工作。

+1

是服务方法works.but我们也应该使用广播接收器发送更新关于位置从服务到活动 – Ruban

+1

以及甚至可以在后台运行。我也一样。 – Lucifer