(UIスレッドではなく)別のスレッドで実行されるサービスを作成するため、IntentServiceを拡張するクラスを実装しました。しかし、私には運がありません。これがコードです。
public class MyService extends IntentService {
public MyService(String name) {
super(name);
// TODO Auto-generated constructor stub
}
@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return null;
}
@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
Log.e("Service Example", "Service Started.. ");
// pushBackground();
}
@Override
public void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
Log.e("Service Example", "Service Destroyed.. ");
}
@Override
protected void onHandleIntent(Intent arg0) {
// TODO Auto-generated method stub
for (long i = 0; i <= 1000000; i++) {
Log.e("Service Example", " " + i);
try {
Thread.sleep(700);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
アクティビティボタンのクリックでのサービス消費:
public void onclick(View view) {
Intent svc = new Intent(this, MyService.class);
startService(svc);
}
具体的な実装では、拡張する抽象IntentServiceクラスのpublic IntentService (String name)
スーパーコンストラクターを呼び出すデフォルトコンストラクターを宣言する必要があります。
public MyService () {
super("MyServerOrWhatever");
}
スーパー実装が適切であれば、onStartCommandを上書きする必要はありません(予想どおり)。
現在のケースでは、例外を取得する必要があります(サービスをインスタンス化できません...)-これを常に質問する価値があります。
ここではそうではありませんが、これは誰かを助けるかもしれません:あなたのサービスを確認してくださいクラスは抽象的ではありません。 SDKからIntentService実装をコピーし、ニーズに合わせて修正したため、この問題が発生しました。
ServiceDemo.Java:
public class ServicesDemo extends Activity implements OnClickListener {
private static final String TAG = "ServicesDemo";
Button buttonStart, buttonStop;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
buttonStart = (Button) findViewById(R.id.buttonStart);
buttonStop = (Button) findViewById(R.id.buttonStop);
buttonStart.setOnClickListener(this);
buttonStop.setOnClickListener(this);
}
public void onClick(View src) {
switch (src.getId()) {
case R.id.buttonStart:
Log.w(TAG, "onClick: starting srvice");
startService(new Intent(this, MyService.class));
startActivity(new Intent(getApplicationContext(),Second.class));
break;
case R.id.buttonStop:
Log.w(TAG, "onClick: stopping srvice");
stopService(new Intent(this, MyService.class));
break;
}
}
}
MyService.Java:
package com.example;
import Android.app.Service;
import Android.content.Intent;
import Android.media.MediaPlayer;
import Android.os.IBinder;
import Android.util.Log;
import Android.widget.Toast;
public class MyService extends Service {
private static final String TAG = "MyService";
MediaPlayer player;
@Override
public IBinder onBind(Intent intent) {
Log.w(" ibinder ","");
return null;
}
@Override
public void onCreate() {
Toast.makeText(this, "My Service Created",0).show();
Log.w(TAG, "onCreate");
player = MediaPlayer.create(this,R.raw.frm7v1);
player.setLooping(true); // Set looping
}
@Override
public void onDestroy() {
Toast.makeText(this, "My Service Stopped",0).show();
Log.w(TAG, "onDestroy");
player.stop();
}
@Override
public void onStart(Intent intent, int startid) {
Toast.makeText(this, "My Service Started :"+intent+" start id :"+startid,0).show();
Log.d(TAG, "onStart");
player.start();
}
}
マニフェストファイルで次の属性を宣言します。
<service Android:enabled="true" Android:name=".MyService" />
デフォルトのパラメータなしのコンストラクタを追加することで、「サービスをインスタンス化できません」という問題を解決しました。
ドキュメントによると、IntentServicesのonStartCommand()をオーバーライドする必要はなく、代わりにドキュメントでIntentServicesのonStartCommand()について次のように記述されています。IntentServiceのこのメソッドをオーバーライドしないでください。代わりに、onHandleIntent(Intent)をオーバーライドします。これは、IntentServiceが開始要求を受信したときにシステムによって呼び出されます。 (Ready4Androidに感謝します)。
以下が元の不正解です(コメントが意味をなすように残されています):
documentation によると、意図的なサービスの起動を処理するには、OnStartCommand()(または非推奨のOnStart())をオーバーライドする必要があります。試しましたか?そして K。Claszen が書いたように-デフォルトのコンストラクタを実装する必要があります。