为什么我在Android启动时无法启动我的服务? (附代码)

时间:2016-08-06 16:08:32

标签: android android-service

我尝试编写简单的基本应用程序,在手机启动时启动我的服务。

我添加了我需要的所有权限。

我在我的android(android 6.01)上安装了应用程序。 当我重新启动手机时 - 我看不到该服务已启动或已执行任何操作。

  1. 为什么这不起作用?
  2. 如何在Android上调试服务?
  3. 代码:

    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAG" />
    
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/Theme.AppCompat.NoActionBar">
    
        <service android:name=".MyService" android:enabled="true" android:exported="true"/>
    
        <receiver android:name=".MainBroadcastReceiver" android:enabled="true" android:exported="true" >
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED"/>
            </intent-filter>
        </receiver>
    </application>
    
    
    
    public class MainBroadcastReceiver extends BroadcastReceiver {
        public MainBroadcastReceiver(){
    
        }
    
        @Override
        public void onReceive(Context context, Intent intent) {
            context.startService(new Intent(context, MyService.class));
        }
    }
    
    
    
    
    public class MyService extends Service {
    
    private File _file;
    private Timer _timer;
    private FileOutputStream _fileOutputStream;
    
    public MyService() throws IOException {
    
        _file = new File("/sdcard/" + "myServiceText.txt");
        _file.createNewFile();
    
        _fileOutputStream = openFileOutput(_file.getName(), Context.MODE_APPEND);
        _fileOutputStream.write("Ctor called".getBytes());
    }
    
    @Override
    public IBinder onBind(Intent arg0) {
        return null;
    }
    
    
    @Override
    public void onCreate() {
        super.onCreate();
    
        _timer = new Timer("timer");
        _timer.schedule(new TimerTask()
        {
            @Override
            public void run()
            {
                try {
                    _fileOutputStream.write("onCreate Called".getBytes());
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }, 0, 5000);
    
    }
    
    @Override
    public void onDestroy() {
        super.onDestroy();
    }
    
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        try {
            _fileOutputStream.write("onStartCommand".getBytes());
        } catch (IOException e) {
            e.printStackTrace();
        }
        return START_STICKY;
    }
    

1 个答案:

答案 0 :(得分:1)

您的代码没问题,因为您的应用处于停止状态,因此您的服务未运行。

1. Stopped state是一个安全程序,可让您的应用程序自行唤醒&#34;只有在用户首次从主屏幕手动启动它之后。(Unless you are a system
通过这样做,可以防止恶意应用程序在您不知道的情况下在手机背景中安装和运行。

2. 如何调试后台进程?
使用后台处理时,您需要两个很棒的工具 -
首先是adb广播命令 -
adb shell am broadcast -a android.intent.action.BOOT_COMPLETED

其次是attach remote debugger(Android Studio):
运行|将调试器附加到android进程(菜单中的最后一个选项) |选择您应用的流程。