我有一个应用程序,我希望在启动完成后自动启动。以下代码似乎过于复杂,我在刷到邻近工作区时会出现不稳定的应用程序启动。
我在这里缺少什么?我有一个活动类,一个服务类,以及一个广播接收器。下面是我的代码(按此顺序),后面是清单。
public class BlueDoor extends Activity implements OnClickListener{
Button btnExit;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
setContentView(R.layout.main);
btnExit = (Button) this.findViewById(R.id.ExitButton);
btnExit.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.ExitButton:
System.exit(0);
break;
}
}
}
service.class
public class BlueDoorStartService extends Service {
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
Toast.makeText(this, "Service Started", Toast.LENGTH_LONG).show();
Intent callIntent = new Intent(Intent.ACTION_CALL);
callIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
callIntent.setClass(this, BlueDoor.class);
startActivity(callIntent);
// do something when the service is created
}
}
广播接收器
public class StartBlueDoorAtBootReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) {
Intent serviceIntent = new Intent(context, BlueDoorStartService.class);
context.startService(serviceIntent);
}
}
}
的Manifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.bluedoor"
android:versionCode="1"
android:versionName="1.0" >
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="21" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<receiver
android:name=".StartBlueDoorAtBootReceiver"
android:enabled="true"
android:exported="false" >
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
<service android:name=".BlueDoorStartService" >
</service>
<activity
android:name=".BlueDoor"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
更新解决方案,2015年10月22日:
将服务更改为:
public class BlueDoorStartService extends Service {
@Override
public IBinder onBind(Intent intent) {
throw new UnsupportedOperationException("Not yet implemented");
}
@Override
public void onCreate() {
super.onCreate();
}
@Override
public void onDestroy() {
super.onDestroy();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return super.onStartCommand(intent, flags, startId);
}
}
和接收者:
public class StartBlueDoorAtBootReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// Start Service On Boot Start Up
Intent serviceIntent = new Intent(context, BlueDoorStartService.class);
context.startService(serviceIntent);
//Start App On Boot Start Up
Intent App = new Intent(context, BlueDoor.class);
App.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(App);
}
}
导致使用服务的工作配置没有行为不端。 然而一起删除服务并修改接收器:
public class StartBlueDoorAtBootReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Intent App = new Intent(context, BlueDoor.class);
App.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(App);
}
}
还导致了一个功能性更简洁的配置,可在启动完成后启动应用程序。
答案 0 :(得分:0)
您的BroadcastReceiver呼叫
context.startService(serviceIntent)
因此,如果服务尚不存在(将在启动后不久就会出现这种情况),将创建该服务,从而从其onCreate()
方法开始活动。所以应用程序在某种程度上有效。
但是当您致电startService()
时,系统始终会调用服务的onStartCommand()
方法。您没有覆盖该方法,因此系统使用类android.app.Service
中的标准实现。
正如您在grepcode.com上所看到的,该方法默认会返回START_STICKY
之类的值。这告诉系统将服务保持活动状态,直到它被明确停止。
在你的情况下,我认为系统通过暂时杀死然后重新动画(=创建)服务来反应滑动,这反过来开始你的活动。
可以找到有关服务生命周期的一些信息here。
你能做什么:
覆盖onStartCommand()
以从那里开始活动,而不是从onCreate()
开始。然后像here
stopSelf(int)
最后一件事:退出活动时,请不要使用System.exit(0)
,而是拨打finish()
,请参阅"why"的这个SO答案。