Androidポーリングに関するソリューション

3887 ワード

この間、会社のプロジェクトでポーリングの操作が必要な機能があったので、ネット上の資料を参考にしてdemoを作りました.主な方案は:AlarmManager+BroadcastReceiver+Service
まず、AlarmManagerを入手し、実行するサービスをパッケージする必要があります.
    /**
     *     
     */
    public static void startPolling(Context context, int seconds, Class<?> cls, String action) {
        //  AlarmManager    
        AlarmManager manager = (AlarmManager) context
                .getSystemService(Context.ALARM_SERVICE);

        //      Service Intent
        Intent intent = new Intent(context, cls);
        intent.setAction(action);
        PendingIntent pendingIntent = PendingIntent.getService(context, 0,
                intent, PendingIntent.FLAG_UPDATE_CURRENT);

        //         
        long triggerAtTime = SystemClock.elapsedRealtime();

        //  AlarmManger setRepeating             (seconds )      Service
        manager.setRepeating(AlarmManager.ELAPSED_REALTIME, triggerAtTime,
                seconds * 1000, pendingIntent);
    }

    /**
     *       
     */
    public static void stopPolling(Context context, Class<?> cls, String action) {
        AlarmManager manager = (AlarmManager) context
                .getSystemService(Context.ALARM_SERVICE);
        Intent intent = new Intent(context, cls);
        intent.setAction(action);
        PendingIntent pendingIntent = PendingIntent.getService(context, 0,
                intent, PendingIntent.FLAG_UPDATE_CURRENT);
        //         
        manager.cancel(pendingIntent);
    }
その後、サービスでデータを取得する操作を実行する必要があります.
 @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
       thread = new Thread(new Runnable() {
            @Override
            public void run() {
                Intent intent = new Intent();
                intent.setAction("CustomBroadcastReceiver");
                intent.putExtra("data",++i);
                sendBroadcast(intent);
            }
        });
        thread.start();
        return super.onStartCommand(intent, flags, startId);
    }
ブロードキャストでは、コールバックを定義しました.ブロードキャストはデータを受信すると、コールバックを実行しactivityにデータを送信します.
 private Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            if(auctionListener == null) {
                Toast.makeText(context,"     ",Toast.LENGTH_SHORT).show();
                return;
            }else {
                auctionListener.onUpdataAction(msg.what);
            }
        }
    };

    @Override
    public void onReceive(Context context, Intent intent) {
        this.context = context;
        Message message = handler.obtainMessage();
        message.what = intent.getIntExtra("data",0);
        handler.sendMessage(message);
    }

しかし、activityにコールバックを設定したのに、リスナーが空の操作を実行しているのに、なぜか分かりません.知っている面倒、返事して、いったい何が原因ですか?
次にactivityで呼び出します.
<span style="font-size:14px;">   @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView = (TextView) findViewById(R.id.text);
        receiver = new CustomBroadcastReceiver();
        receiver.setOnAuctionListener(this);
        IntentFilter intentFilter = new IntentFilter(CustomBroadcastReceiver.ACTION);
        registerReceiver(receiver,intentFilter);
        PollingUtils.startPolling(this,1,MyService.class,MyService.ACTION);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(receiver);
        PollingUtils.stopPolling(this,MyService.class,MyService.ACTION);
    }

    @Override
    public void onUpdataAction(int data) {
      textView.setText(data+"");
    }</span>