如何在后台运行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应用程序[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在背景上每5分钟在Android应用程序中运行代码? [重复]

让我的活动在后台运行以收集 gps [重复]

需要在android中每分钟运行一个后台任务

如何在 ionic/android 后台运行应用程序

iPhone:重复后台任务

如何知道android后台运行了多少应用程序?