サービスを正しく使用する方法を学んでいますが、問題が発生しています。整数をインクリメントするサービスを開始するテスト アプリケーションがあります。メッセンジャーを使用して、整数の増分として UI を更新することができました。さらに、元のアクティビティの起動モードを singleTask に設定することができました。これにより、サービスで保留中のインテントを使用してメイン アクティビティのインスタンスに戻ることができました。
私が抱えている問題は、古いアクティビティが破棄された後 (画面の回転、アプリの終了など)、新しいアクティビティ (実際には新しい UI ビューに到達することに集中しています) をサービスに再接続する方法です。 .)?
画面が回転したり、アクティビティが破棄されたりすると、UI を再度開いたときにアプリケーションが起動したときと同じ状態になりますが、サービスがまだ実行されていることがわかります。
以下は、サービスの私のコードです。
public class BackgroundService extends Service {
private static final String TAG = "BackgroundService";
private NotificationManager notificationMgr;
int counter;
// use regular thread
private ThreadGroup myThreads = new ThreadGroup("ServiceWorker");
public void onCreate() {
super.onCreate();
notificationMgr = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
displayNotificationMessage("Background Service is running");
};
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
super.onStartCommand(intent, flags, startId);
int counter = intent.getExtras().getInt("counter");
Messenger msg = (Messenger) intent.getExtras().get("msg_JIB");
new Thread(myThreads, new ServiceWorker(counter, msg), "BackgroundService")
.start();
return START_NOT_STICKY;
}
class ServiceWorker implements Runnable
{
int counter = -1;
private Messenger msg1 = null;
public ServiceWorker(int counter, Messenger msg) {
this.counter = counter;
this.msg1 = msg;
}
public void run() {
final String TAG2 = "ServiceWorker:" + Thread.currentThread().getId();
// do background processing here...
try {
while (counter<100){
Message message = Message.obtain();
message.arg1=counter;
msg1.send(message);
counter = counter +1;
Thread.sleep(5000);
}
} catch (Throwable e) {
Log.v(TAG2, "... sleep interrupted");
}
}
}
private void displayNotificationMessage(String message) {
Notification notification = new Notification(R.drawable.emo_im_winking,
message, System.currentTimeMillis());
Intent i = new Intent(this, ProDroid_Android_CH11_Local_ServiceActivity.class);
//i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_SINGLE_TOP);
PendingIntent contentIntent = PendingIntent.getActivity(this, 0,
i, 0);
notification.setLatestEventInfo(this, TAG, message, contentIntent);
notification.flags |= Notification.FLAG_NO_CLEAR;
notificationMgr.notify(0, notification);
}
@Override
public void onDestroy()
{
Log.v(TAG, "in onDestroy(). Interrupting threads and cancelling notifications");
myThreads.interrupt();
notificationMgr.cancelAll();
super.onDestroy();
}
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
}
これは私の主な活動のコードです:
public class ProDroid_Android_CH11_Local_ServiceActivity extends Activity {
private static final String TAG = "MainActivity";
private int counter = 1;
Handler handler = new Handler() {
@Override
public void handleMessage(android.os.Message msg) {
TextView tv = (TextView) findViewById(R.id.textView1);
tv.setText("Count: " + msg.arg1);
};
};
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
}
public void doClick(View view) {
switch (view.getId()) {
case R.id.startBtn:
Log.v(TAG, "Starting service... counter = " + counter);
Intent intent = new Intent(
ProDroid_Android_CH11_Local_ServiceActivity.this,
BackgroundService.class);
intent.putExtra("counter", counter);
intent.putExtra("msg_JIB", new Messenger(handler));
startService(intent);
break;
case R.id.stopBtn:
stopService();
}
}
private void stopService() {
Log.v(TAG, "Stopping service...");
if (stopService(new Intent(
ProDroid_Android_CH11_Local_ServiceActivity.this,
BackgroundService.class)))
Log.v(TAG, "stopService was successful");
else
Log.v(TAG, "stopService was unsuccessful");
}
@Override
public void onDestroy() {
//stopService();
super.onDestroy();
}
}
どんな助けでも大歓迎です。
どうも