1

因此,经过 2-3 小时的失败后,我终于让我的远程服务以某种方式工作,但它的表现真的很奇怪。

我正在使用 AIDL 将 mediaPath 字符串发送到我的服务,它开始播放音乐就好了,但是 onStartCommand 永远不会被调用,并且应用程序中的服务条目没有我在清单文件中设置的标签/描述。[http://i50.tinypic.com/344p349.png]

如果我终止主 Activity 进程,服务也会终止,尽管它位于一个单独的进程中。这是应该的吗?[http://i49.tinypic.com/16hpa86.png]

而且我从来没有得到“服务断开连接”日志,这应该在服务与活动解除绑定时发生。

服务代码:

package com.example.randomserviceshitnot;

import java.io.IOException;

import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;

public class MojPrviServis extends Service {
    private final Servis.Stub binder = new Servis.Stub() {
        public void execute(String mediaPath) throws RemoteException {
            MediaPlayer mp = new MediaPlayer();

            try {
                mp.setDataSource(mediaPath);
                mp.prepare();
            } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (SecurityException e) {
                e.printStackTrace(); } catch (IllegalStateException e) { e.printStackTrace();
            } catch (IOException e) { e.printStackTrace(); }
                mp.start();
        }
    };

    public void onCreate() {
        super.onCreate();
        Log.d("Filip", "Service onCreate called.");
    }

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

    public void onDestroy() {
        super.onDestroy();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.d("Filip ", "Service onStart called.");
        return START_STICKY;
    }
}

活动代码:

package com.example.randomserviceshitnot;

import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.Environment;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;

public class MainActivity extends Activity {
    private Servis mBoundService;
    private boolean mIsBound = false;
    private static final String mediaPath = Environment.getExternalStorageDirectory().toString()+"/Music/Art Of The Dress(Archie Remix).mp3";

    private ServiceConnection mConnection = new ServiceConnection() {
        public void onServiceConnected(ComponentName name, IBinder service) {
            Log.d("Filip ", "Service connected."); 
            mBoundService = Servis.Stub.asInterface(service);
            try {
                mBoundService.execute(mediaPath);
            } catch (RemoteException e) {
                e.printStackTrace();
            }
        }

        public void onServiceDisconnected(ComponentName name) {
            Log.d("Filip ", "Service disconnected.");
            mBoundService = null;
        }
    };

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    protected void onStart() {
        super.onStart();
        doBindService();
    }

    void doBindService() {
        Intent s = new Intent();
        s.setAction("remote.servis");
        bindService(s, mConnection, Context.BIND_AUTO_CREATE);
        mIsBound = true;
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        doUnbindService();
    }

    public void onPause() {
        super.onPause();
        doUnbindService();
    }

    void doUnbindService() {
        if(mIsBound) {
            unbindService(mConnection);
            mIsBound=false;
        }
    }
}

爱迪尔:

package com.example.randomserviceshitnot;

interface Servis {
    void execute(String s);
}

显现:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.randomserviceshitnot"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="15" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/title_activity_main" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <service android:name=".MojPrviServis"
            android:label="@string/servis_koji_notifikuje"
            android:description="@string/proces_desc"
            android:icon="@drawable/ic_launcher"
            android:process=":dep" >
            <intent-filter>
                <action android:name="remote.servis" />
            </intent-filter>
        </service>
    </application>
</manifest>
4

1 回答 1

0

http://developer.android.com/guide/components/services.html

阅读 onStartCommand() 和 onBind() 的文档

当您调用 bindService() 时,不会调用 onStartCommand()。但是 onBind() 被调用。

如果使用 bindservice() 启动服务,如果所有客户端都退出,则服务也会终止。

要播放音乐,您应该使用 startService() 而不是 bind。如果以这种方式启动服务,那么当客户端存在时它不会停止。完成后它必须自行停止。

于 2014-12-18T14:13:31.907 回答