gpt4 book ai didi

android - 使用 Service、TimerTask 和 BroadcastReceiver 检查各种更新

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:41:42 26 4
gpt4 key购买 nike

我正在尝试创建一个执行以下操作的简单程序:

  1. 由我的 Activity (UpdateServiceActivity) 启动的服务 (NewsService) 检查新闻。
  2. 如果找到新闻 (NewsService),则向接收器 (NewsReceiver) 发送广播。
  3. 收到广播后,接收器 (NewsReceiver) 应通知 Activity (UpdateServiceActivity) 有新闻。
  4. 收到通知后, Activity (UpdateServiceActivity) 获取消息并进行处理。

到目前为止,我只是在处理一个简单的示例。到目前为止,这是我的代码:

更新服务 Activity

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;
}
}
}

新闻服务

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 );
}
}
}

新闻接收者

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();
}
}

list

<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>

我遇到的问题是:

  • 当点击“主页”按钮时(应用程序进入后台,并在暂停时调用),NewsReceiver 会继续触发 toasts。我的理解是,一旦我取消注册接收器,它就不能用于接收广播。
  • 即使我按下按钮停止 NewsService,TimerTask 也会继续运行并发布广播。

我做错了什么?这是对广播/接收工作原理的普遍误解吗?我是否走上正轨?应该改变什么才能实现我的愿望?

最佳答案

  • 您正在创建和取消注册一个新的 Receiver 实例,但这对您在 list 文件中注册的接收器没有影响。尝试从 list 中删除它。
  • 您永远不会取消 Timer,这就是它一直触发的原因。停止服务不会自动停止您创建的线程(例如 Timer 使用的线程)

通常,您应该使用带有 IntentServiceAlarmManager 来安排重复的后台任务。 Timer 不可靠,不太适合 Android 框架。此外,如果手机处于 sleep 状态,Timer 将不会执行。您可以使用 AlarmManager 将闹钟唤醒手机以执行(这对于新闻更新服务是否是个好主意是另一回事)。

关于android - 使用 Service、TimerTask 和 BroadcastReceiver 检查各种更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7736816/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com