如何使应用程序在关闭后也能正常工作

How to make app works also after closed

感谢您之前的 post,我能够创建一个应用程序,在与任何设备断开连接时禁用蓝牙连接。一切正常,但我仍然面临一个问题......只有在应用程序打开时它才能工作。我怎样才能让它在关闭时也能正常工作?

请在下面找到用于主要 Activity 的代码:

package com.myapps.connectionmanager;

import java.util.Set;
import java.util.TimerTask;

import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
import android.os.Bundle;
import android.preference.ListPreference;
import android.preference.PreferenceActivity;
import android.preference.PreferenceManager;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;
import android.util.Log;

public class QuickPrefsActivity extends PreferenceActivity {
    private static final String TAG = "QuickPrefsActivity";
    private static final int REQUEST_ENABLE_BT = 12;
    private static boolean state = false;
    private BluetoothAdapter adapter;
    private SharedPreferences sharedPrefs;
    private Boolean getPrefValue;
    private int getTimePrefValue;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.preferences);

        //controllo esistenza BT
        setBluetoothAdapter();

        IntentFilter filter1 = new IntentFilter(BluetoothDevice.ACTION_ACL_CONNECTED);
        IntentFilter filter2 = new IntentFilter(BluetoothDevice.ACTION_ACL_DISCONNECT_REQUESTED);
        IntentFilter filter3 = new IntentFilter(BluetoothDevice.ACTION_ACL_DISCONNECTED);
        this.registerReceiver(mReceiver, filter1);
        this.registerReceiver(mReceiver, filter2);
        this.registerReceiver(mReceiver, filter3);


    }

    @Override
    public void onDestroy() {
        super.onDestroy();

        // Unregister broadcast listeners
        unregisterReceiver(mReceiver);
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        menu.add(Menu.NONE, 0, 0, "Show current settings");
        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case 0:
            startActivity(new Intent(this, ShowSettingsActivity.class));
            return true;
        }
        return false;
    }

    private void setBluetoothAdapter() {
        // Getting the Bluetooth adapter
        adapter = BluetoothAdapter.getDefaultAdapter();
        Log.i(TAG,
                "\nAdapter: " + adapter.toString() + "\n\nName: "
                        + adapter.getName() + "\nAddress: "
                        + adapter.getAddress());
        // Check for Bluetooth support in the first place
        // Emulator doesn't support Bluetooth and will return null
        if (adapter == null) {
            Toast.makeText(this, "Bluetooth NOT supported. Aborting.",
                    Toast.LENGTH_LONG).show();
        }
                }

            //The BroadcastReceiver that listens for bluetooth broadcasts
    private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);

            if (BluetoothDevice.ACTION_FOUND.equals(action)) {
                Log.i(TAG,"Device found");
            }
            else if (BluetoothDevice.ACTION_ACL_CONNECTED.equals(action)) {
                Log.i(TAG,"Device is now connected");
            }
            else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) {
                Log.i(TAG,"Done searching");
            }
            else if (BluetoothDevice.ACTION_ACL_DISCONNECT_REQUESTED.equals(action)) {
                Log.i(TAG,"Device is about to disconnect");
            }
            else if (BluetoothDevice.ACTION_ACL_DISCONNECTED.equals(action)) {
                Log.i(TAG,"Device has disconnected");
                switchOFF_BT();
            }           
        }
    };

    private static boolean blueToothON_OFF_Status() {
        BluetoothAdapter bluetooth = BluetoothAdapter.getDefaultAdapter();
        if (!bluetooth.isEnabled()) {
            Log.i(TAG,"Bluetooth is Disable...");
            state = true;
        } else if (bluetooth.isEnabled()) {
//          String address = bluetooth.getAddress();
//          String name = bluetooth.getName();
//          Log.i(TAG,name + " : " + address);
            state = false;
        }
        return state;
        }

    private void switchOFF_BT(){
        if (!blueToothON_OFF_Status()){
            adapter.disable();
        }
    }

}

非常感谢

这里有一些关于您正在尝试做的事情的重要资源:

创建后台服务:
https://developer.android.com/training/run-background-service/create-service.html

运行 在后台服务中:
http://developer.android.com/training/run-background-service/index.html

我也会看看最佳实践部分

How to make app works also after closed

您可以使用 Service 来完成。有了它,您可以在关闭应用后 运行 您的应用。

这里有一个完美的例子来说明如何做 Android Services Tutorial

小提示

因此,当您在 MainActivity 上创建 Service class 时,您可以添加这些方法。

// Method to start the service
public void startService(View view) {
   startService(new Intent(getBaseContext(), MyService.class));
}

// Method to stop the service
public void stopService(View view) {
    stopService(new Intent(getBaseContext(), MyService.class));
}

另外不要忘记将此添加到您的 manifest.xml

<service android:name=".MyService" />

还有一个 Example of service

希望对您有所帮助,如果您需要更多帮助,请告诉我,我会帮助您。