【问题标题】:Do a background task and communicate with activity执行后台任务并与活动通信
【发布时间】:2016-09-19 16:48:25
【问题描述】:

我有一个Activity,用户可以启动一个后台网络任务。 Activity 需要与任务通信(双向)。

如果 Activity 被终止并且任务需要用户输入,则任务应该抛出重新启动 Activity 的通知。

所以。什么项目应该是“任务?服务?意图服务?

【问题讨论】:

标签: android


【解决方案1】:

任务可以是广播接收器来重新启动活动。检查这个:

Android - launch app from broadcast receiver

BroadCast Receiver Documentation

【讨论】:

    【解决方案2】:

    后台任务可以是 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();
    
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-18
      • 1970-01-01
      • 1970-01-01
      • 2011-05-27
      相关资源
      最近更新 更多