关于它有几个问题,但我总是读到同样的东西:“如果系统需要资源,服务将被杀死”或“你不能构建一个永远运行的服务,因为它在后台运行的越多,它就越容易受到影响到系统杀死它”等。
我面临的问题是:我的服务运行良好,正如预期的那样,如果我运行我的应用程序然后退出它,我的服务仍在运行,但是当我杀死我的应用程序时(通过转到“最近的应用程序”并滑动它离开)服务停止。此时,如果我转到设置>>应用程序>>运行,我会看到服务正在重新启动。过了一会儿,它又回来了,我的服务运行没有问题。
我用谷歌搜索,我发现了一些我可以做的事情,但让我们先看看我的代码:
我通过这种方式启动我的服务(单击按钮后):
Intent intent = new Intent (MainActivity.this, MyService.class);
startService(intent);
我还有 3 个额外的整数,所以我有这样的东西:
final Integer i, i2, i3;
i = 5; //for example
i2 = 10; //for example
i3 = 15; //for example
final Intent intent = new Intent (MainActivity.this, MyService.class);
intent.putExtra("INTEGER1", i);
intent.putExtra("INTEGER2", i2);
intent.putExtra("INTEGER3", i3);
startService(intent);
在 MyService 中,我有以下内容:
public class MyService extends Service
{
AlarmManager am;
BroadcastReceiver br;
PendingIntent pi;
Integer i, i2, i3;
@Override
public void onCreate()
{
super.onCreate();
am = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
pi = PendingIntent.getBroadcast(this, 0, new Intent("anyany"); 0) //Why those zeros?
br = new BroadcastReceiver ()
{
public void onReceive (Context context, Intent i) {
new thread(new Runnable()
{
public void run()
{
//do something
}
}).start();
}
};
}
@Override
public void onStartCommand(Intent intent, int flags, int startId)
{
super.onStartCommand(intent, flags, startId);
try
{
i = intent.getIntExtra("INTENT1", 0) // I don't understant yet why this zero are here
i2 = intent.getIntExtra("INTENT2", 0)
i3 = intent.getIntExtra("INTENT3", 0);
}
catch(NullPointerException e) {}
this.registerReceiver(br, new IntentFilter("anyany"));
new thread(new Runnable()
{
public void run()
{
am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock. elapsedRealtime() + i*1000, i2*1000, pi);
}
}).start();
return START_REDELIVER_INTENT; //so I can get my Extra even with my Activity closed
}
我的 onDestroy:
@Override
public void onDestroy()
{
unregisterReceiver(br);
super.onDestroy();
}
我也有 onBind() 方法(没有@Override),但它返回 null。我谷歌了很多,我试图在前台运行该服务,所以我这样做了(在 de onStartCommand 内部):
Notification n = new Notification(R.drawable.ic_laucher), getText(R.string.app_name), System.currentTimeMillis());
PendingIntent npi = PendingIntent.getActivity(this, MainActivity.class);
n.setLatestEventInfo(this, getText(R.string.notification_title), getText(R.string.notification_message), npi);
startForeground(3563, n);
我的通知出现了,当我点击它时,我的应用程序运行,但我的服务问题没有得到解决(我相信它仍然没有在前台运行)。通知也重新启动。
我还删除了 Try catch 并为整数定义了一个值(所以我没有使用 getIntExtra() 方法),但没有任何改变
经过几次测试后,我尝试查看日志,当我杀死我的应用程序时,我收到以下消息:计划重启崩溃的服务。
那么,由于某种原因,当我的 MainActivity 死亡时,我的服务崩溃了,为什么?这里的目的不是将服务转换为无法杀死的上帝(我认为这根本不是不可能的,WhatsApp 运行了 105 小时!)而是防止我的服务在我的应用程序死后不崩溃.
我不知道这是否有帮助,但这是我在 Manifest.xml 中添加的内容
<Activity android:name = ".MyService"/>
<service android:name ="Myservice" android:enabled="true" android: exported="false"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>
最小 API = 9,目标 API = 17。运行时服务的大小:约 3MB。
希望我对我的英语很清楚和抱歉。
PS:整个代码都按预期运行,所以如果你看到任何 sintax 错误,可以自由编辑它。
编辑
如果我在 AndroidManifest.xml 中添加android:isolatedProcess="true"
,<service>
我会在 logCat 中收到此错误:java.lang.RuntimeException: Unable to create a service in com.mycompany.myapp.myservice: java.lang.SecurityException: Isolated process not allow ed to call getIntentSender
当我使用它启动我的服务时,MainActivity 没有显示任何错误,只有服务崩溃。