我有一个活动,用户可以启动一个后台网络任务。活动需要与任务(双向)交流。做一个后台任务并与活动沟通
如果活动中止并且任务需要用户输入,那么任务应该为重新启动活动发出通知。
所以。哪些项目应该是”任务的服务意向服务
我有一个活动,用户可以启动一个后台网络任务。活动需要与任务(双向)交流。做一个后台任务并与活动沟通
如果活动中止并且任务需要用户输入,那么任务应该为重新启动活动发出通知。
所以。哪些项目应该是”任务的服务意向服务
后台任务可能是一个Service,IntentService或一个AsyncTask,问题是接收用户输入,必须在一个activity中完成,所以你必须告诉activity从后台线程重启,这可以通过一个广播接收器或者一个处理程序(带有弱引用)。
我将使用一个服务,活动和处理程序如下图所示:
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();
}
}
这为开始提供了一个坚实的观点。谢谢! – amchacon
任务可以是广播接收机重新启动活动检查:???
取决于如何经常或长期的“任务”将运行,但你应该看看https://developer.android.com/reference/android/os/AsyncTask.html –