Android 带有内部类BroadcastReceiver的AlarmManager

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

我是android新手。我在玩AlarmManager,并成功地将一段代码作为一个单独的类与BroadcastReceiver一起运行

我现在尝试将BroadcastReceiver作为内部类,但没有成功地触发BroadcastReceiver。我不知道在看了好几个小时的代码后会出什么问题

这是我的密码:

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()这段代码仅用于学习目的。顺便说一句,感谢您提供有关使用日历的信息。这能解决您的问题吗?