タイトルに似た質問は検索されていますが、解決策はまだありません。 私は、次のサービスにAndroidサービスを停止する
public class MyService extends Service {
public MyService() {
}
private static final String TAG =
"ServiceExample";
@Override
public void onCreate() {
super.onCreate();
Log.i(TAG, "Service onCreate");
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.i(TAG, "Service onStartCommand " + startId);
final int currentId = startId;
Runnable r = new Runnable() {
public void run() {
for (int i = 0; i < 3; i++)
{
long endTime = System.currentTimeMillis() +
10*1000;
while (System.currentTimeMillis() < endTime) {
synchronized (this) {
try {
wait(endTime -
System.currentTimeMillis());
} catch (Exception e) {
}
}
}
Log.i(TAG, "Service running " + currentId);
}
//stopSelf();
}
};
Thread t = new Thread(r);
t.start();
return Service.START_STICKY;
}
@Override
public IBinder onBind(Intent intent) {
Log.i(TAG, "Service onBind");
return null;
}
@Override
public void onDestroy() {
Log.i(TAG, "Service onDestroy");
super.onDestroy();
//Log.i(TAG, "Service Destroyed");
}
}
を持っており、これは2つのボタンがあり、私の活動から呼び出された:それは
public class ServiceExampleActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_service_example);
}
public void buttonClick(View view)
{
Intent intent = new Intent(this, MyService.class);
startService(intent);
}
public void stopClick(View view)
{
Intent intent = new Intent(this, MyService.class);
stopService(intent);
}
}
しかし、これは動作しません停止するためのサービスを開始するための1つずつ。サービスは停止しません。 不思議なことに、onDestroy関数が呼び出されますが、その後は実行可能ファイルがまだ実行されています。 サービスを停止するにはどうすればよいですか?
=============================
EDIT:(それはonStartCommand内で宣言される前に)、スレッドTがクラスメンバーでなければならなかったと私はこのように実行可能な修飾onDestroy機能において
@Override
public void onDestroy() {
Log.i(TAG, "Service onDestroy");
// mHandler.removeCallbacks(r);
t.interrupt();
super.onDestroy();
//Log.i(TAG, "Service Destroyed");
}
:私は最終的に次のように変更することによってそれを達成
r = new Runnable() {
public void run() {
for (int i = 0; i < 3; i++)
{
long endTime = System.currentTimeMillis() +
10*1000;
while (System.currentTimeMillis() < endTime) {
synchronized (this) {
try {
wait(endTime -
System.currentTimeMillis());
} catch (Exception e) {
return; //HERE to detect if the thread has been interrupted
}
}
}
Log.i(TAG, "Service running " + currentId);
}
stopSelf();//I have to use this otherwise it doesn't stop
}
};
通常、私はstopSelf中断された場合は必要ありません。私はstop自身がonDestroyを呼び出すと仮定します。
ありがとうございました。あなたの助言に基づいて私が行った変更をもとに、質問を修正しました。それは今働いているようだ! – KansaiRobot