在启动完成时启动Android应用程序:我的解决方案是否过于复杂?

时间:2015-10-22 05:15:38

标签: android broadcastreceiver

我有一个应用程序,我希望在启动完成后自动启动。以下代码似乎过于复杂,我在刷到邻近工作区时会出现不稳定的应用程序启动。

我在这里缺少什么?我有一个活动类,一个服务类,以及一个广播接收器。下面是我的代码(按此顺序),后面是清单。

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);
}
}

还导致了一个功能性更简洁的配置,可在启动完成后启动应用程序。

1 个答案:

答案 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答案。