后台任务可以是 Service、IntentService 或 AsyncTask。问题是接收用户输入,这必须在活动中完成。所以你必须告诉活动从后台线程重新启动。这可以通过广播接收器或处理程序(使用弱引用)来完成。
我将使用如下服务、活动和处理程序:
public class ActivityMain extends Activity
{
public static MyService myService;
private MyHandler myHandler = new MyHandler(this);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
protected void onResume() {
super.onResume();
startService(MyService.class, myConnection, null);
}
private static class MyHandler extends Handler {
private final WeakReference<ActivityMain> activityMain;
public MyHandler(ActivityMain activity) {
activityMain = new WeakReference<>(activity);
}
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case MyService.NEED_USER_INPUT:
final Intent i = new Intent(activityMain, ActivityMain.class);
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(i);
break;
}
}
}
private final ServiceConnection myConnection = new ServiceConnection()
{
@Override
public void onServiceConnected(ComponentName arg0, IBinder arg1)
{
myService = ((MyService.UsbBinder) arg1).getService();
myService.setHandler(myHandler);
}
@Override
public void onServiceDisconnected(ComponentName arg0)
{
myService = null;
}
};
private void startService(Class<?> service, ServiceConnection serviceConnection, Bundle extras)
{
if(MyService.SERVICE_CONNECTED == false)
{
Intent startService = new Intent(this, service);
if(extras != null && !extras.isEmpty())
{
Set<String> keys = extras.keySet();
for(String key: keys)
{
String extra = extras.getString(key);
startService.putExtra(key, extra);
}
}
startService(startService);
}
Intent bindingIntent = new Intent(this, service);
bindService(bindingIntent, serviceConnection, Context.BIND_AUTO_CREATE);
}
}
和服务:
public class MyService extends Service
{
public static final int NEED_USER_INPUT = 0;
public static boolean SERVICE_CONNECTED = false;
private IBinder binder = new UsbBinder();
private Context context;
private Handler myHandler;
@Override
public void onCreate()
{
this.context = this;
}
@Override
public IBinder onBind(Intent intent)
{
return binder;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId)
{
return Service.START_NOT_STICKY;
}
@Override
public void onDestroy()
{
super.onDestroy();
}
public void setHandler(Handler myHandler)
{
this.myHandler = myHandler;
}
public class UsbBinder extends Binder
{
public MyService getService()
{
return MyService.this;
}
}
private needUserInput() //call when you need to restart activity
{
if(myHandler != null)
myHandler.obtainMessage(NEED_USER_INPUT).sendToTarget();
}
}