为什么我能';当android启动时,我不能启动我的服务吗?(附代码)

为什么我能';当android启动时,我不能启动我的服务吗?(附代码),android,android-service,Android,Android Service,我正在尝试编写一个简单的基本应用程序,在手机启动时启动我的服务 我添加所有需要的权限 我在我的android(android 6.01)上安装该应用程序。 当我重新启动手机时,我看不到服务是否启动或是否有任何动作 为什么这不起作用 如何在android上调试服务 守则: <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <uses-permission android:nam

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

我添加所有需要的权限

我在我的android(android 6.01)上安装该应用程序。 当我重新启动手机时,我看不到服务是否启动或是否有任何动作

  • 为什么这不起作用
  • 如何在android上调试服务 守则:

    <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;
    }
    
    
    公共类MainBroadcastReceiver扩展了BroadcastReceiver{
    公共广播接收器(){
    }
    @凌驾
    公共void onReceive(上下文、意图){
    startService(新意图(context,MyService.class));
    }
    }
    公共类MyService扩展服务{
    私有文件;
    私人定时器;
    私有文件输出流_FileOutputStream;
    public MyService()引发IOException{
    _file=新文件(“/sdcard/”+“myServiceText.txt”);
    _createNewFile();
    _fileOutputStream=openFileOutput(\u file.getName(),Context.MODE\u APPEND);
    _fileOutputStream.write(“被调用的.getBytes());
    }
    @凌驾
    公共IBinder onBind(意图arg0){
    返回null;
    }
    @凌驾
    public void onCreate(){
    super.onCreate();
    _定时器=新定时器(“定时器”);
    _timer.schedule(新TimerTask()
    {
    @凌驾
    公开募捐
    {
    试一试{
    _write(“onCreate调用了.getBytes());
    }捕获(IOE异常){
    e、 printStackTrace();
    }
    }
    }, 0, 5000);
    }
    @凌驾
    公共空间{
    super.ondestory();
    }
    @凌驾
    公共int onStartCommand(Intent Intent、int标志、int startId){
    试一试{
    _fileOutputStream.write(“onStartCommand.getBytes());
    }捕获(IOE异常){
    e、 printStackTrace();
    }
    返回开始时间;
    }
    
    您的代码没有问题,您的服务没有运行的原因是因为您的应用程序处于停止状态 1.是一种安全程序,仅在用户首次从主屏幕手动启动应用程序后,才允许应用程序“自行唤醒”。(
    通过这样做,android可以防止恶意应用程序在您不知情的情况下在您的手机后台安装和运行。 2.如何调试后台进程?
    在处理后台流程时,您需要两个非常好的工具-
    首先是adb广播命令-
    adb shell am广播-安卓系统.intent.action.BOOT\u已完成

    第二个是附加远程调试器(Android Studio):

    运行|将调试器附加到android进程(菜单中的最后一个选项)|选择应用程序的进程。

    是否先在设备上运行一次?启动时运行的内容必须由用户手动运行至少一次,然后才能自动启动。是的,我在设备上运行了一次。我还手动打开了所有权限。您的XML中缺少类别。添加
    到您的意图过滤器,然后重试。我没有在您的清单中看到a
    活动
    。在重新启动之前,您如何运行应用程序?您不需要每次都显示
    活动
    。用户只需在安装后至少运行一次应用程序,即可使其脱离停止状态。这通常是由用户启动其主
    活动
    完成。否则,将需要另一个应用程序在您的应用程序中显式启动组件。谢谢,我检查了所有附加的链接。但我仍然无法理解..我需要添加活动吗?是否有任何代码示例可以显示,因为我在Google上找不到任何示例是的,您需要在上添加至少一项活动,并通过手机主屏幕手动启动。