我有一个简单的AutoStart
应用程序,TimerTask
实现,在几乎许多设备中都可以正常工作。问题是它无法在Samsung Galaxy Y(2.3.6)
和DELL XCD35(2.2)
中运行。当设备启动TimerTask
工作几秒钟然后关闭。我查看Application->Manage Application
,我看到Applcation已经在Force Stop
州。这意味着我的应用程序在几秒钟后停止运行。那么,这两个设备中weird behaviour
的原因是什么,如果有人有解决方案,请分享它。
以下是我的代码。
MyReceiver.java
public class MyReceiver extends BroadcastReceiver{
private Timer mTimer = new Timer();
@Override
public void onReceive(Context context, Intent arg1) {
Toast.makeText(context, "Device Booted", Toast.LENGTH_LONG).show();
Log.d("TAG","Device Booted");
mTimer.scheduleAtFixedRate(new MyTimerTask(), 2000,2000);
}
private class MyTimerTask extends TimerTask
{
@Override
public void run() {
Log.d("TAG","TimerTask executed....");
}
}
}
的AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.autostart.app"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk android:minSdkVersion="8" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<receiver android:name=".MyReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
</application>
</manifest>
答案 0 :(得分:2)
我建议您使用AlarmManager而不是TimerTask,因为我遇到了您在许多设备中描述的相同问题。
public void onReceive(Context context, Intent arg1) {
Toast.makeText(context, "Device Booted", Toast.LENGTH_LONG).show();
Log.d("TAG","Device Booted");
AlarmManager AM =(AlarmManager)getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent();
intent.setAction("ALARM_MANAGER_ACTION");//can add any string action here
PendingIntent pi = PendingIntent.getBroadcast(mContext
.getApplicationContext(), 0, intent,0);
AM.set(AlarmManager.RTC,selectedTime, pi);
AM.setRepeating(AM.RTC_WAKEUP, System.currentTimeMillis()+2000, 2000, pi);
}
public class MyReceiver1 extends BroadcastReceiver{
//event will come here
private Timer mTimer = new Timer();
@Override
public void onReceive(Context context, Intent arg1) {
// check if event is same as you broadcasted through alarmManager
Toast.makeText(context, "Device Booted", Toast.LENGTH_LONG).show();
Log.d("TAG","TimerTask executed....");
}
在您的应用中添加一个广播接收器,该接收器应该监听("ALARM_MANAGER_ACTION")
动作。并将此操作添加到清单文件中。
我敢打赌它也可以在这两个设备中使用。
答案 1 :(得分:0)
我认为在某些Android
OS
中有时操作系统会杀死Android不熟悉的Devices
Boots
时运行的线程认识到它。这就是TimerTask
在某些设备中工作的原因,并且在某些设备中工作的时间为5-10秒,然后Android操作系统上的应用程序为ForceStopped
automatically
Device
1}} Boot
(注意 - 它的强制停止来自管理应用程序,而不是强制关闭所以我没有在Logcat中收到任何错误。)
因此,在这种情况下,解决方案是使用inbuilt
Mechanism
Android
OS
识别并且不会将其终止并使其保持运行模式。在这种情况下,我使用AlarmManager
管理来执行我的任务,并且它可以正常工作。
我可能不对,但我的最终解决方案是使用AlarmManager
使我的应用程序在每个设备中都能正常工作。
@Override
public void onReceive(Context context, Intent arg1) {
Intent myIntent = new Intent(context, AlarmService.class);
PendingIntent pendingIntent = PendingIntent.
getService(context, 0, myIntent, 0);
AlarmManager alarmManager = (AlarmManager) context
.getSystemService(Context.ALARM_SERVICE);
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,
System.currentTimeMillis() + 2000, 2000, pendingIntent);
}
<强>更新强>
AlaramManager is critical system service that runs all the time.