-1

数日前、アプリでひどい問題が発生しました。私のアプリは、特定の作業をバックグラウンドで何度も再起動していました。onStartCommand()しばらくして、すべての問題がサービスのメソッドにあることがわかりました。たとえば、URL、名前、パスなどの情報を指定してサービスを開始することでダウンロードタスクを開始すると、すべて正常に動作します。しばらくして、他のアプリを使用しているとき。同じダウンロード タスクが再開されたというトースト メッセージが表示されます。したがって、明らかにすべての問題はサービスにあります。サービスを少し検索しましたが、サービスが再起動する理由を混乱させます。誰かが正しい情報を提供すれば、それは非常に役に立ちます。サービスコードは次のとおりです。

 public class DownloadService extends Service {

    private DownloadManager mDownloadManager;

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }


    @Override
    public void onCreate() {
        super.onCreate();
        mDownloadManager = new DownloadManager(this, (FatherApplication) getApplication());
     }


    protected boolean addDownload(String fileU, String fileP, String fileN){
        try{
            if(mDownloadManager != null){
                mDownloadManager.addTask(fileU, fileP, fileN);
            }
            return true;
        }catch(Exception e){
            e.printStackTrace();
            return false;
        }
    }


    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        super.onStartCommand(intent, flags, startId);
        FatherApplication mApp =(FatherApplication) getApplication();
        /** I am not sure the Global has been intilized or not, So i need to check is the global data is intilized or 
         * has been null. if null intilized it by calling GlobalData.getIntense(). */
         if(mApp.getGlobalData() == null){
             mApp.setGlobalData();
         }

        if (mDownloadManager == null) {
            mDownloadManager = new DownloadManager(this, (FatherApplication) getApplication());         
            }   
        String action = intent.getAction();
        int type = -1;

        if(action.equals( SystemIntent.INTENT_ACTION_START_SARVICE )){
            type= intent.getIntExtra(SystemIntent.TYPE, -1);   
            }

        /* --- Add --- */
        if(type != -1 && type == SystemIntent.Types.ADD){
            String fname= intent.getStringExtra(SystemIntent.FILE_NAME);
            String fpath= intent.getStringExtra(SystemIntent.FILE_PATH);
            String furl = intent.getStringExtra(SystemIntent.FILE_URL);
            this.addDownload(furl,fpath,fname);
            }

        /* --- paused --- */
        if(type != -1 && type == SystemIntent.Types.PAUSE){
         String fname= intent.getStringExtra(SystemIntent.FILE_NAME);
         String fpath= intent.getStringExtra(SystemIntent.FILE_PATH);
         String furl = intent.getStringExtra(SystemIntent.FILE_URL);
         if(this.mDownloadManager.isThatARunningTask(furl,fname,fpath))
         this.mDownloadManager.pauseTask(furl,fname,fpath);
         else Toast.makeText(this,"That's not running task.",2).show();
       }
        /* --- deleted --- */
        if(type != -1 && type == SystemIntent.Types.DELETE){
            String fname= intent.getStringExtra(SystemIntent.FILE_NAME);
            String fpath= intent.getStringExtra(SystemIntent.FILE_PATH);
            String furl = intent.getStringExtra(SystemIntent.FILE_URL);
            this.mDownloadManager.deleteTask(furl,fname,fpath);
        }

        /* --- source deleted --- */
        if(type != -1 && type == SystemIntent.Types.DELETE_SOURCE){
            String fname= intent.getStringExtra(SystemIntent.FILE_NAME);
            String fpath= intent.getStringExtra(SystemIntent.FILE_PATH);
            String furl = intent.getStringExtra(SystemIntent.FILE_URL);
            this.mDownloadManager.deleteTask(furl,fname,fpath);
        }

        /* --- restarted --- */
        if(type != -1 && type == SystemIntent.Types.RESTART){
            String fname= intent.getStringExtra(SystemIntent.FILE_NAME);
            String fpath= intent.getStringExtra(SystemIntent.FILE_PATH);
            String furl = intent.getStringExtra(SystemIntent.FILE_URL);
            this.mDownloadManager.restartTask(furl,fname,fpath);
        }

        /* --- resumed --- */
        if(type != -1 && type == SystemIntent.Types.RESUME){
            String fname= intent.getStringExtra(SystemIntent.FILE_NAME);
            String fpath= intent.getStringExtra(SystemIntent.FILE_PATH);
            String furl = intent.getStringExtra(SystemIntent.FILE_URL);
            if(!this.mDownloadManager.isThatARunningTask(furl,fname,fpath))
                this.mDownloadManager.resumeTask(furl,fname,fpath);
                else Toast.makeText(this,"That's a running task.",2).show();
            }
        return this.START_REDELIVER_INTENT;
    }

    /** I going to destroy the service , shibo you should do your importent works. */
    @Override
    public void onDestroy(){ 
    this.mDownloadManager.close();
    super.onDestroy();
    }

}
4

2 に答える 2

1

インテントを開始する

//to register the services
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(ServicesTemplate.MY_ACTION);
registerReceiver(myReceiver, intentFilter);
//to start this services
Intent myIntent = new Intent(Mainactivity.this, Yourserviceclassname.class);
startService(myIntent);

意図を止めるには

Intent oIntent = new Intent(Mainactivity.this, Yourserviceclassname.class);
stopService(oIntent);

ダウンロードが完了したら、サービスを停止する必要があります

于 2013-09-02T08:35:14.460 に答える
0

サービスを開始するときは、目的が達成されたら停止する必要があります。サービスを停止するには、2 つの方法があります。

1.メソッドでサービスを停止できますstopService()。startService(intent) メソッドをどれだけ頻繁に呼び出しても、stopService() メソッドを 1 回呼び出すだけでサービスが停止します。

2.サービスは、メソッドを呼び出すことによってそれ自体を終了できますstopSelf()。これは通常、サービスが作業を終了した場合に行われます。

あなたの場合、Intentserviceサービスの代わりにIntentServices、ファイルのダウンロードなどの 1 回限りのタスクとして使用することをお勧めします。

// Start the  service
public void startService(View view) {
    startService(new Intent(this.your_activity, Your_Service.class));
}

// Stop the  service

public void stopService(View view) {

    stopService(new Intent(this.your_activity, Your_Service.class));
}

参照できるサービスの詳細については、

  1. Vogella によるサービスのチュートリアル2. Android サービス
于 2013-09-02T08:55:26.270 に答える