Androidポーリングに関するソリューション
3887 ワード
この間、会社のプロジェクトでポーリングの操作が必要な機能があったので、ネット上の資料を参考にしてdemoを作りました.主な方案は:AlarmManager+BroadcastReceiver+Service
まず、AlarmManagerを入手し、実行するサービスをパッケージする必要があります.
しかし、activityにコールバックを設定したのに、リスナーが空の操作を実行しているのに、なぜか分かりません.知っている面倒、返事して、いったい何が原因ですか?
次にactivityで呼び出します.
まず、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>