今天项目有个需求是,开启一个服务单独运行在后台,而且还不能有界面,在度娘搜索了一圈也没发现可以完美解决的方法,然后自己尝试解决的方法,开始的思路是,把界面干掉,也就是activity,然后将开启Service的操作放在Application中,结果运行程序,在控制台报错了。

Android 创建单独的服务运行在后台(无界面)_解决方法


因为我把AndroidManifest.xml中的主Activity的配置给干掉了,而程序找不到应用的入口,所有就无法打开应用,这种方法行不通。


然后我就想,把Activity保留,但是我不给它 setContentView(......);也就是不给他设置布局文件,




  1. public class MainActivity extends Activity {

  2. @Override
  3. protected void onCreate(Bundle savedInstanceState) {
  4. super.onCreate(savedInstanceState);

  5. System.out.println("MainActivity OnCreate()....");

  6. System.out.println("准备开启服务");
  7. Intent intent = new Intent(MainActivity.this,TestService.class);
  8. startService(intent);
  9. }
  10. }



运行程序,程序打开了,服务也运行了,但是有个问题就是,界面也出来了,为什么呢?


Android 创建单独的服务运行在后台(无界面)_android_02

Android 创建单独的服务运行在后台(无界面)_java_03


原因是在AndroidManifest.xml中Application节点中这个这行代码android:theme="@style/AppTheme",既然是主题的问题导致界面的出现,那么是想android是否提供了不显示界面的主题?查找后问题终于解决了,解决方法:在清单文件中,主activity的配置中添加这行代码


android:theme="@android:style/Theme.NoDisplay"

代码:


  1. <application
  2. android:allowBackup="true"
  3. android:icon="@drawable/ic_launcher"
  4. android:label="@string/app_name"
  5. android:theme="@style/AppTheme" >
  6. <activity
  7. android:name=".MainActivity"
  8. android:label="@string/app_name"
  9. android:theme="@android:style/Theme.NoDisplay"
  10. >
  11. <intent-filter>
  12. <action android:name="android.intent.action.MAIN" />

  13. <category android:name="android.intent.category.LAUNCHER" />
  14. </intent-filter>
  15. </activity>

  16. <service android:name="com.example.backgroundservice.TestService" >
  17. </service>
  18. </application>



我们还可以Ctrl+左键点进去看看这个主题是怎么写的:



  1. <!-- Default theme for activities that don't actually display a UI; that
  2. is, they finish themselves before being resumed. -->
  3. <style name="Theme.NoDisplay">
  4. <item name="android:windowBackground">@null</item>
  5. <item name="android:windowContentOverlay">@null</item>
  6. <item name="android:windowIsTranslucent">true</item>
  7. <item name="android:windowAnimationStyle">@null</item>
  8. <item name="android:windowDisablePreview">true</item>
  9. <item name="android:windowNoDisplay">true</item>
  10. </style>



运行程序,服务开启了,界面也不显示,完美解决了后台启动服务的进程。