使用服务,TimerTask的和广播接收器来检查各种更新 [英] Using Service, TimerTask and BroadcastReceiver to check for various updates

查看:96
本文介绍了使用服务,TimerTask的和广播接收器来检查各种更新的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图创建一个简单的程序,执行以下操作:

I'm trying to create a simple program that does the following:


  1. 将我的活动(UpdateServiceActivity)检查消息启动的服务(NewsService)。

  2. 如果消息被发现(NewsService)发送一个广播接收器(NewsReceiver)。

  3. 在接收到广播接收器(NewsReceiver)应通知活动(UpdateServiceActivity)有消息。

  4. 接获通知后,活动(UpdateServiceActivity)得到的消息和处理它们。

到目前为止,我只是工作的一个简单的例子。这里是我的code迄今:

So far I'm just working on a simple example. Here is my code so far:

UpdateServiceActivity

public class UpdateServiceActivity extends Activity implements OnClickListener {
  private static final String TAG = "UpdateServiceActivity";
  Button buttonStart, buttonStop;
  BroadcastReceiver receiver;

  @Override
  public void onCreate( Bundle savedInstanceState ) {
    super.onCreate( savedInstanceState );
    setContentView( R.layout.main );

    buttonStart = (Button) findViewById( R.id.buttonStart );
    buttonStop = (Button) findViewById( R.id.buttonStop );

    buttonStart.setOnClickListener( this );
    buttonStop.setOnClickListener( this );

    receiver = new NewsReceiver();
  }

  @Override
  protected void onPause() {
    super.onPause();
    unregisterReceiver( receiver );
  }

  @Override
  protected void onResume() {
    super.onResume();
    registerReceiver( receiver, new IntentFilter() );
  }

  public void onClick( View src ) {
    switch( src.getId() ) {
      case R.id.buttonStart:
        Log.e( TAG, "onClick: starting service" );
        startService( new Intent( this, NewsService.class ) );
        break;
      case R.id.buttonStop:
        Log.e( TAG, "onClick: stopping service" );
        stopService( new Intent( this, NewsService.class ) );
        break;
    }
  }
}

NewsService

public class NewsService extends Service {
  public static final String NEWS_INTENT = "bs.kalender.news";
  private Timer timer = new Timer();

  @Override
  public IBinder onBind( Intent arg0 ) {
    return null;
  }

  @Override
  public void onStart( Intent intent, int startId ) {
    startService();
  }

  private void startService() {
    timer.scheduleAtFixedRate( new NewsChecker(), 0, 5000 );
  }

  private class NewsChecker extends TimerTask {
  @Override
  public void run() {
    Intent intent = new Intent( getApplicationContext(), NewsReceiver.class );
    sendBroadcast( intent );
  }
 }
}

NewsReceiver

public class NewsReceiver extends BroadcastReceiver {
  @Override
  public void onReceive( Context context, Intent intent ) {
    Toast.makeText( context, "Broadcast recieved! There is news!", Toast.LENGTH_SHORT).show();
  } 
}

清单

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  package="bs.update"
  android:versionCode="1"
  android:versionName="1.0">
  <uses-sdk android:minSdkVersion="7" />
  <uses-permission android:name="android.permission.INTERNET" />
  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
  <application android:icon="@drawable/icon" android:label="@string/app_name" android:debuggable="true">
      <activity android:name=".UpdateServiceActivity"
              android:label="@string/app_name">
          <intent-filter>
              <action android:name="android.intent.action.MAIN" />
              <category android:name="android.intent.category.LAUNCHER" />
          </intent-filter>
      </activity>
      <service android:name=".NewsService" />
      <receiver android:name=".NewsReceiver" />
  </application>
</manifest>

我跑的问题是:


  • 在当前打黑Home'按钮(在App转到后台,并在暂停的叫法)的NewsReceiver保持射击祝酒。我是,一旦我注销了接收器的理解,它不应该是菱接收广播。

  • 就算我打的按钮停止NewsService,一个TimerTask保持运行和张贴播出。

我是什么做错了吗?它是如何广播/接收作品的一般误解?我是上了轨道,应该怎样改完成什么我的愿望?

What am I doing wrong? Is it a general misunderstanding of how Broadcasting/Receiving works? Am I on track and what should be changed to accomplish what I desire?

推荐答案

修改

这与尼古拉Elenkov建议有关使用的ScheduledThreadPoolExecutor组合提供了一个非常好的解决方案。

This in combination with Nikolay Elenkov suggestion about using ScheduledThreadPoolExecutor provided a very nice solution.

我发现适合我的目的不是使用服务和广播接收器更好的解决方案。我有没有必要检查时,应用程序没有运行新闻/更新,因此使用服务将是矫枉过正,只是使用比需要更多的数据。我发现,使用处理程序是要走的路。这里是一个完美的作品的实现:

I found a solution that fits my purpose better than using a Service and BroadcastReceiver. I have no need to check for news/updates when the app is not running, so using a service would be overkill and just use more data than needed. I found that using Handlers was the way to go. Here is the implementation that works perfectly:

Avtivity:

public class UpdateServiceActivity extends Activity implements OnClickListener {
   private Handler handlerTimer;
   private Runnable newsHandler;

   @Override
   public void onCreate( Bundle savedInstanceState ) {
      handlerTimer = new Handler();
      newsHandler = new NewsHandler( handlerTimer, this );
      handlerTimer.removeCallbacks( newsHandler );
   }

   @Override
   protected void onPause() {
      handlerTimer.removeCallbacks( newsHandler );
      super.onPause();
   }

   @Override
   protected void onResume() {
      handlerTimer.postDelayed( newsHandler, 5000 );
      super.onResume();
   }
}

NewsHandler

public class NewsHandler implements Runnable {
   private static final int THERE_IS_NEWS = 999;
   private Handler timerHandler;
   private Handler newsEventHandler;
   private Context context;

   public NewsHandler( Handler timerHandler, Context context ) {
      this.timerHandler = timerHandler;
      this.newsEventHandler = new NewsEventHandler();
      this.context = context;
   }

   public void run() {
      Message msg = new Message();
      msg.what = THERE_IS_NEWS;
      newsEventHandler.sendMessage( msg );
      timerHandler.postDelayed( this, 5000 );
   }

   private class NewsEventHandler extends Handler { 
      @Override
      public void handleMessage( Message msg ) {
         if( msg.what == THERE_IS_NEWS )
               Toast.makeText( context, "HandlerMessage recieved! There is news!", Toast.LENGTH_SHORT ).show();
      }
   };
}

这篇关于使用服务,TimerTask的和广播接收器来检查各种更新的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆