我想我已经把自己编成了一个角落。但我会尽力解释我的问题。基本上我在android上构建一个应用程序应该是手机上的警报应用程序的副本。我有一个代表警报的对象。它包括时间,以及作为布尔等的日子。我通过序列化它们并将它们保存到文件来持久存储这些对象。然后,在启动时,我有一个广播记录器启动启动服务。基本上,bootservice有一个循环遍历我的警报列表。我试图在每个报警对象上调用一个名为" setSysAlarm()"的方法,它应该在保存的时间重新创建每个android系统报警。目前," setSystemAlarm"方法只是为测试目的创建一个toast。但这导致应用程序崩溃。我的设计显然存在缺陷,我认为尝试使用应用程序上下文会导致崩溃。我的想法是,我应该在运行时通过GUI通过服务创建所有警报,以及在启动时重新创建警报?因此,无论应用程序运行在何处,都可以创建警报,还可以在一个地方创建警报?下面是我在引导时执行的引导服务代码。
public class BootService extends Service {
private Thread setallarams;
private file_acces_int fileaccess;
private ArrayList<alarm_entity> alarmlst;
private Runnable setalarmsrunnable = new Runnable() {
@Override
public void run()
{
for(alarm_entity alarm : alarmlst)
{
alarm.setSystemAlarm();
}
}
};
@Override
public void onCreate()
{
fileaccess = new file_access_model(getApplicationContext());
alarmlst = fileaccess.readFromFile();
setallarams = new Thread(setalarmsrunnable);
cont = this;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId)
{
setallarams.start();
try {
setallarams.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
stopSelf();
return START_STICKY;
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
这是我的alarm_entity类的setSystemAlarm()方法。基本上这是为了在启动时创建一个吐司,但目前应用程序正在崩溃
public void setSystemAlarm()
{
Toast.makeText(cont, "hi there", Toast.LENGTH_SHORT);
}
如果有人可以帮助我,我会感激它。我用来获取上下文的方法是 1.从bootService传入它。对我来说似乎不可行吗? 2.在每个alarm_entity的构造函数中创建Application的实例并将其用作上下文。这对我来说似乎也很愚蠢。洛尔
无论如何,提前感谢并抱歉这个冗长的问题!
答案 0 :(得分:0)
将此权限添加到您的清单
> android.permission.RECEIVE_BOOT_COMPLETED
答案 1 :(得分:0)
无论如何,我们已经讨论了如何获得Logcat输出:)。基本问题是,为什么会出现此错误。也许这不是完整的答案,但我需要展示一些代码。您正在服务的onCreate()内初始化您的上下文:
@Override
public void onCreate()
{
fileaccess = new file_access_model(getApplicationContext());
alarmlst = fileaccess.readFromFile();
setallarams = new Thread(setalarmsrunnable);
cont = this;
}
但是像API中描述的那样:
请勿直接调用此方法。
我不知道这是否是你崩溃的原因,我们没有Logcat,可能是任何其他原因。但建议您在onStartCommand()
中进行初始化,因此请将初始化设置在onStartComand()
:
@Override
public int onStartCommand(Intent intent, int flags, int startId)
{
fileaccess = new file_access_model(getApplicationContext());
alarmlst = fileaccess.readFromFile();
setallarams = new Thread(setalarmsrunnable);
setallarams.start();
.
.
.
另一件事是,我看不到初始化alarm_entity类,也许我是盲人(?),但是我无法看到你将一个上下文传递给这个类。例如,如果您正在初始化此类,则必须在您的onStartCommand()中包含类似的内容;
mAlarm_entity = new alarm_entity(this);
因为服务保留了上下文,所以只需调用this
即可。删除onCreate()
,然后您不需要初始化上下文,因为该服务已全部完成。