使用服务,TimerTask的和广播接收器来检查各种更新 [英] Using Service, TimerTask and BroadcastReceiver to check for various updates
问题描述
我试图创建一个简单的程序,执行以下操作:
I'm trying to create a simple program that does the following:
- 将我的活动(UpdateServiceActivity)检查消息启动的服务(NewsService)。
- 如果消息被发现(NewsService)发送一个广播接收器(NewsReceiver)。
- 在接收到广播接收器(NewsReceiver)应通知活动(UpdateServiceActivity)有消息。
- 接获通知后,活动(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屋!