2015-10-22 9 views
0

我有一个应用程序,我想在启动完成后自动启动。下面的代码看起来过于复杂,并且在滑动到相邻工作区时出现不稳定的应用程序。启动完成时启动Android应用程序:我的解决方案过于复杂吗?

我在这里错过了什么?我有一个活动课,一个服务课,以及一个广播接收器。下面是我的代码(依次),然后是清单。

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> 

UPDATE向(S),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); 
    } 
} 

导致一个工作配置使用服务w /不行为不端。 然而删除该服务的所有在一起,从而修改所述接收器:

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

你的广播接收器调用

context.startService(serviceIntent)

因此,如果不存在,就(开机后不久,这将是这种情况),因此从开始活动的服务将被创建了onCreate()方法。所以应用程序在一定程度上起作用。

但是当您拨打startService()时,系统始终会调用该服务的方法onStartCommand()。您没有重写该方法,因此系统使用类android.app.Service的标准实施。

正如你可以在grepcode.com上阅读的那样,该方法默认返回一个值,如START_STICKY。这告诉系统保持服务活动直到它明确停止。

在你的情况下,我想系统通过暂时杀死然后重新生成(=创建)服务来对刷卡做出反应,从而开始你的活动。

有关服务生命周期的一些信息可以在here找到。

你可以做什么: 覆盖onStartCommand()从那里,而不是从onCreate()开始活动。然后使用stopSelf(int)等记载here

最后一件事:从活动退出时,不要使用System.exit(0)但拨打finish()相反,看到这个SO回答"why"

相关问题