gpt4 book ai didi

安卓无法绑定(bind)服务

转载 作者:太空狗 更新时间:2023-10-29 13:41:37 24 4
gpt4 key购买 nike

android 新手,想搞清楚服务。我正在尝试将服务绑定(bind)到 Activity ,我正在按照文档中的示例进行操作,但我不断在下面标记的行 (appService.playSong(title)) 上收到 NullPointerException。在调试器中检查它会发现 appService 确实为 null。

public class Song extends Activity implements OnClickListener,Runnable {
protected static int currentPosition;
private ProgressBar progress;
private TextView songTitle;
private MPService appService;

private ServiceConnection onService = new ServiceConnection() {
public void onServiceConnected(ComponentName className,
IBinder rawBinder) {
appService = ((MPService.LocalBinder)rawBinder).getService();
}

public void onServiceDisconnected(ComponentName classname) {
appService = null;
}
};


public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.song);

Intent bindIntent = new Intent(Song.this,MPService.class);
bindService(bindIntent,onService,
Context.BIND_AUTO_CREATE);

Bundle b = getIntent().getBundleExtra("songdata");
String title = b.getString("song title");

// ...

appService.playSong(title); // nullpointerexception

// ...

}

这是服务的相关部分:

package org.example.music;

// imports

public class MPService extends Service {
private MediaPlayer mp;
public static int currentPosition = 0;
public List<String> songs = new ArrayList<String>();
public static String songTitle;
private static final String MEDIA_PATH = new String("/mnt/sdcard/");

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

mp = new MediaPlayer();
songs = Music.songs;
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return Service.START_STICKY;
}

public class LocalBinder extends Binder {
MPService getService() {
return MPService.this;
}
}

private final IBinder binder = new LocalBinder();

@Override
public IBinder onBind(Intent intent) {
return binder;
}

public void playSong(String songPath) {
try {
mp.reset();
mp.setDataSource(songPath);
mp.prepare();
mp.start();

mp.setOnCompletionListener(new OnCompletionListener() {
public void onCompletion(MediaPlayer arg0) {
nextSong();
}
});

songTitle = songPath.substring(12,songPath.length()-4);

} catch (IOException e) {
Log.v(getString(R.string.app_name),e.getMessage());
}
}

public void nextSong() {
if (++currentPosition >= songs.size()) {
currentPosition = 0;
}
String song = MEDIA_PATH+songs.get(currentPosition);
playSong(song);
}

public void prevSong() {
if (--currentPosition<0) {
currentPosition=songs.size()-1;
}
String song = Music.MEDIA_PATH+songs.get(currentPosition);
playSong(song);
}

public int getSongPosition() {
return mp.getCurrentPosition();
}

public MediaPlayer getMP() {
return mp;
}
}

我已经在 AndroidManifest.xml 中注册了该服务并设置了 android:enabled="true"。你看到这里有什么明显的错误吗?

最佳答案

您可以进行本地和远程两种绑定(bind)。本地仅供您的应用程序使用,如果供任何实现特定接口(interface)的应用程序使用,则为远程。您应该从本地绑定(bind)开始。

Local binding tutorial .
Remote binding tutorial .

我没有绑定(bind)的解决方案:

public class MyActivity extends Activity{

@Override
public void onCreate(Bundle savedInstanceState){
...
Intent it = new Intent(MyService.ACTIVITY_START_APP);
it.setClass(getApplicationContext(), MyService.class);
startService(it);
}

...

@Override
protected void onResume() {
super.onResume();
registerBroadcastReceiver();
}

@Override
protected void onPause() {
super.onPause();
this.unregisterReceiver(this.receiver);
}

...

private BroadcastReceiver receiver = new BroadcastReceiver(){

@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(MyService.BROADCAST_INIT)) {
//do your stuff here after init
}
}
};

private void registerBroadcastReceiver(){
IntentFilter filter = new IntentFilter();
filter.addAction(HMyService.BROADCAST_INIT);
this.registerReceiver(receiver, filter);
}
}

您的服务:

public class MyService extends Service{

public static final String BROADCAST_INITIAL_DATA = "org.myapp.BROADCAST_INIT";
public static final String ACTIVITY_START_APP = "org.myapp.ACTIVITY_START_APP";

@Override
public int onStartCommand (Intent intent, int flags, int startId){
super.onStartCommand(intent, flags, startId);
if(intent.getAction().equals(ACTIVITY_START_APP)){
//do your initialization
//inform the client/GUI
Intent i = new Intent();
i.setAction(BROADCAST_INIT);
sendBroadcast(i);
}else{
//some other stuff like handle buttons
}
}
}

祝你好运。

关于安卓无法绑定(bind)服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4966653/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com