Android 带有内部类BroadcastReceiver的AlarmManager
我是android新手。我在玩AlarmManager,并成功地将一段代码作为一个单独的类与BroadcastReceiver一起运行 我现在尝试将BroadcastReceiver作为内部类,但没有成功地触发BroadcastReceiver。我不知道在看了好几个小时的代码后会出什么问题 这是我的密码:Android 带有内部类BroadcastReceiver的AlarmManager,android,broadcastreceiver,alarmmanager,inner-classes,Android,Broadcastreceiver,Alarmmanager,Inner Classes,我是android新手。我在玩AlarmManager,并成功地将一段代码作为一个单独的类与BroadcastReceiver一起运行 我现在尝试将BroadcastReceiver作为内部类,但没有成功地触发BroadcastReceiver。我不知道在看了好几个小时的代码后会出什么问题 这是我的密码: public class InnerService extends Service{ @Override public IBinder onBind(Intent inten
public class InnerService extends Service{
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
public void onCreate() {
super.onCreate();
IntentFilter filter = new IntentFilter(InnerBroadcastReceiver.class.toString());
Log.d("InnerService","InnerService starts!");
Log.d("InnerService","class : "+InnerBroadcastReceiver.class.toString());
this.registerReceiver(new InnerBroadcastReceiver(), filter);
scheduleTestAlarmReceiver(this);
}
public static void scheduleTestAlarmReceiver(Context context) {
Log.d("scheduleTestAlarmReceiver", "scheduleTestAlarmReceiver start");
Intent receiverIntent = new Intent(context, InnerBroadcastReceiver.class);
receiverIntent.setAction("com.example.alarmmanagertest.InnerService$InnerBroadcastReceiver");
PendingIntent sender = PendingIntent.getBroadcast(context, 123456789,
receiverIntent, 0);
AlarmManager alarmManager = (AlarmManager) context
.getSystemService(Context.ALARM_SERVICE);
alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
SystemClock.elapsedRealtime(), 1000, sender);
Log.d("scheduleTestAlarmReceiver", "scheduleTestAlarmReceiver complete");
}
private class InnerBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
Log.d("InnerBroadcastReceiver","InnerBroadcastReceiver ALARM Manager fires success!");
}
}
}
看起来AlarmManager试图每秒启动一次BroadcastReceiver,但失败了
日志:
V/AlarmManager(2439): waitForAlarm result :4
V/AlarmManager(2439): trigger ELAPSED_REALTIME_WAKEUP or RTC_WAKEUP
更新
我已尝试将onCreate()
和scheduleTestAlarmReceiver()
中用于创建意图的代码更改为intent=new intent(“action\u string”)
,效果良好。似乎intent.setAction()
不起作用
在有上下文和无上下文的情况下创建意图的利弊是什么(intent(context-packageContext,Class-cls)
和intent(String-action)
)?
但是我仍然想知道为什么上面的代码失败了。有人能解释吗?是的,它很管用
我的代码中的小改动。带有AsyncTask的Apk(从web下载文件并对其进行解析)。“OneMeeting”是我的项目课
public class MainActivity extends AppCompatActivity {
public static final String INPUT_FILE_URL = "https://.../";
private RecyclerView recyclerView;
private String getFilesDir;
private ArrayList<OneMeeting> meetingsArr = new ArrayList<>();
private BroadcastReceiver receiver;
private RefreshFile refreshFile;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
getFilesDir = getFilesDir().getAbsolutePath();
recyclerView = findViewById(R.id.recycler_view);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setItemAnimator(new DefaultItemAnimator());
meetingsArr.add(new OneMeeting("Launching..." , "", "", ""));
recyclerView.setAdapter(new MyAdapter(meetingsArr, recyclerView));
Intent alarmIntent = new Intent("commaciejprogramuje.facebook.conferenceapplication.MainActivity$RefreshFile");
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 111, alarmIntent, 0);
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 1000 * 60 * 5, pendingIntent);
}
@Override
protected void onResume() {
super.onResume();
refreshFile = new RefreshFile();
IntentFilter filter = new IntentFilter("commaciejprogramuje.facebook.conferenceapplication.MainActivity$RefreshFile");
this.registerReceiver(refreshFile, filter);
}
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(refreshFile);
}
private class RefreshFile extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "Refresh", Toast.LENGTH_LONG).show();
ParsePage refreshParsingPage = new ParsePage(new ParsePage.OnTaskCompletedListener() {
@Override
public void onTaskCompletedListener(ArrayList<OneMeeting> parsingResultArr) {
meetingsArr = parsingResultArr;
recyclerView.setAdapter(new MyAdapter(meetingsArr, recyclerView));
}
});
refreshParsingPage.execute(getFilesDir);
}
}
public类MainActivity扩展了AppCompatActivity{
公共静态最终字符串输入\u文件\u URL=”https://.../";
私人回收站;
私有字符串getFilesDir;
private ArrayList meetingsArr=new ArrayList();
专用广播接收机;
私有刷新文件;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
StrictMode.ThreadPolicy policy=新建StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(策略);
getFilesDir=getFilesDir().getAbsolutePath();
recyclerView=findViewById(R.id.recycler\u视图);
recyclerView.setLayoutManager(新的LinearLayoutManager(本));
setItemAnimator(新的DefaultItemAnimator());
添加(新的OneMeeting(“启动…”,“”,“”,“”,“”,“”);
setAdapter(新的MyAdapter(meetingsArr,recyclerView));
Intent alarmIntent=new Intent(“commaciejprogramuje.facebook.conferenceapplication.MainActivity$RefreshFile”);
PendingEvent PendingEvent=PendingEvent.getBroadcast(this,111,alarmIntent,0);
AlarmManager AlarmManager=(AlarmManager)getSystemService(报警服务);
alarmManager.setInexactRepeating(alarmManager.RTC_唤醒,System.currentTimeMillis(),1000*60*5,PendingContent);
}
@凌驾
受保护的void onResume(){
super.onResume();
refreshFile=新的refreshFile();
IntentFilter=newintentfilter(“commaciejprogramuje.facebook.conferenceapplication.MainActivity$RefreshFile”);
此.registerReceiver(刷新文件、过滤器);
}
@凌驾
受保护的空onDestroy(){
super.ondestory();
未注册接收人(刷新文件);
}
私有类刷新文件扩展了BroadcastReceiver{
@凌驾
公共void onReceive(上下文、意图){
Toast.makeText(上下文,“刷新”,Toast.LENGTH_LONG.show();
ParsePage refreshParsingPage=新建ParsePage(新建ParsePage.OnTaskCompletedListener(){
@凌驾
公用void onTaskCompletedListener(ArrayList PARSINGSULTARR){
会议R=parsingResultArr;
setAdapter(新的MyAdapter(meetingsArr,recyclerView));
}
});
refreshParsingPage.execute(getFilesDir);
}
}
}您在清单中注册了接收者吗?我正在尝试使用动态注册接收者,因此我没有将其放入清单中。顺便问一下,您为什么使用SystemClock.elapsedRealtime()?这将返回启动后的时间(毫秒)。相反,使用Calendar对象并使用cal.getTimeInMillis()这段代码仅用于学习目的。顺便说一句,感谢您提供有关使用日历的信息。这能解决您的问题吗?