2016-09-19 24 views
0

我有一个活动,用户可以启动一个后台网络任务。活动需要与任务(双向)交流。做一个后台任务并与活动沟通

如果活动中止并且任务需要用户输入,那么任务应该为重新启动活动发出通知。

所以。哪些项目应该是”任务的服务意向服务

+0

取决于如何经常或长期的“任务”将运行,但你应该看看https://developer.android.com/reference/android/os/AsyncTask.html –

回答

1

后台任务可能是一个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(); 

     } 
    } 
+0

这为开始提供了一个坚实的观点。谢谢! – amchacon