Android 服务不会从线程启动

标签 android android-service

我正在尝试从我用 getApplicationContext() 初始化的线程启动服务,但 context.startService 返回 null。我不知道为什么。 提前致谢。

主逻辑.java

public class MainLogic extends Thread {
Context context;

public MainLogic(Context context) {
    this.context = context;
}

ArrayList<Messenger> mClients = new ArrayList<Messenger>();
Messenger bluetoothService;
Messenger mMessanger = new Messenger(new MainHandler());

private class MainHandler extends Handler {
    @Override
    public void handleMessage(Message msg) {
        switch (msg.what) {
        case MessageType.NEW_HEARTH_RATE: {
                         //stuff

            break;
        }
        case MessageType.REGISTER: {
            mClients.add(msg.replyTo);break;
        }
        case MessageType.UNREGISTER: {
            mClients.remove(msg.replyTo);break;
        }
        case MessageType.START_BLUETOOTH_SERVICE: {
            startBluetoothService();
            break;
        }

        default:
            break;
        }

    }
}

private ServiceConnection bluetoothConnection = new ServiceConnection() {

    @Override
    public void onServiceDisconnected(ComponentName name) {
        Message msg = Message.obtain();
        msg.what = MessageType.CONNECTION_ENDED;
        msg.replyTo = mMessanger;

        try {
            bluetoothService.send(msg);
        } catch (RemoteException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
        bluetoothService = new Messenger(service);

        Message msg = Message.obtain();
        msg.replyTo = mMessanger;
        msg.what = MessageType.CONNECTION_ESTABLISHED;

        try {
            bluetoothService.send(msg);
        } catch (RemoteException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }
};

public void startBluetoothService() {
            //This is where i start the service
    Intent intent = new Intent(context, BluetoothService.class);
    ComponentName name=  context.startService(intent);
            //name equals null after startService 

    boolean bind=context.bindService(new Intent(context,    BluetoothService.class),
            //bind equals false after bindService
            bluetoothConnection, Context.BIND_AUTO_CREATE);

}

@Override
public void run() {
    while(true){

    }

}

public Messenger getMessanger() {
    return mMessanger;
}

}

蓝牙服务.java:

public class BluetoothService extends Service {
private NumberGenerator nGenerator;

final Messenger mMessenger = new Messenger(new BluetoothServiceHandler());
ArrayList<Messenger> mClients = new ArrayList<Messenger>();


private final class BluetoothServiceHandler extends Handler {

    @Override
    public void handleMessage(Message msg) {
        switch (msg.what) {
             //random messaging
        }

        default:
            break;
        }

    }
}

@Override
public void onCreate() {
    HandlerThread thread = new HandlerThread("BluetoothService",
            Process.THREAD_PRIORITY_BACKGROUND);
    thread.start();

    super.onCreate();
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    Message msg = Message.obtain();

    msg.arg1 = startId;
    msg.what = MessageType.START_NUMBERGENERATOR;
    try {
        mMessenger.send(msg);
    } catch (RemoteException e) {
        e.printStackTrace();
    }

    return START_STICKY;
}

@Override
public void onDestroy() {
    Message msg = Message.obtain();
    msg.what = MessageType.BLUETOOTH_SERVICE_STOPED;

    try {
        mMessenger.send(msg);
    } catch (RemoteException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    super.onDestroy();
}

@Override
public IBinder onBind(Intent intent) {
    // TODO Auto-generated method stub
    return mMessenger.getBinder();
}
}

这就是我开始线程的方式:

    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    MainLogic mainLogic=new MainLogic(this.getApplicationContext());
    mainLogic.setPriority(Thread.MAX_PRIORITY);
    mainLogic.start();

    mainMessenger=mainLogic.getMessanger();

    Message message= Message.obtain();
    message.what=MessageType.REGISTER;
    message.replyTo=actMessenger;
    try {
        mainMessenger.send(message);
    } catch (RemoteException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }}

更新 1: list :

 <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.bugra.bluetoothcomponent"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="14"
        android:targetSdkVersion="17" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <service android:name="BluetoothService"  />
        <activity
            android:name="com.bugra.bluetoothcomponent.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

最佳答案

问题可能出在 list 声明中。 当你尝试启动这个服务时,你必须有一个异常告诉你它没有找到。你应该输入你的服务的完全限定名称(带有包名称),或者至少是一个点“。 “如果您的服务位于根包中,则在名称前面。您的 list 行应如下所示:

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

或者:

<service android:name="com.bugra.bluetoothcomponent.BluetoothService"  />

关于Android 服务不会从线程启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16132528/

相关文章:

java - java中带有自定义对象的列表的深拷贝

Android 在通知 Intent 上添加额外内容

android - 应用程序关闭后粘性服务重新启动

android - Android 的 Wakelock 是后台服务的必需品吗?

android - 如何将 svg 转换为适用于 android 的矢量资源

android - 如何使用 Material Design Android 实现这个自定义弹出菜单?

android - 从 Scrollview 派发事件到底层 Viewpager

Android设备慢速计算

android - Android 上 Local Service 和 Activity 的通信

android - 如何在服务中获取我的应用程序的 widgetID 和 ComponentName