2017-05-01 6 views
0

私は自分のアプリケーションのサービスが必要ですが、ユーザーがアプリケーションの終了ボタンを押すまで、常に実行しておく必要があります。それは次のようになります:ユーザが開始、私のサービス開始(通知btwを開始)、そして2〜3時間後に、ユーザは通知をクリックしなければなりません。ボタンを押してサービスを終了します。私はこのことを簡単にするためにStart-Endサイクルと呼んでいます。 私のユーザーは1日に多くのスタート・エンド・サイクルを使用しますが、電話がロックされているとしばらくしてから通知が消えてしまうという問題があります。 私はすでに通知とサービスをStackoverflowに置くことができましたので、これも解決策があることを祈っています:)ここでstartForeground()でもAndroidサービスが終了しました

は私の主な活動である:ここでは

public class MainActivity extends AppCompatActivity{ 
    @Override 
protected void onCreate(final Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    checkEnabled(); 
    mTimeListenerD.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { //Button to set the Start time 
      setDebutTime(); 
      checkEnabled(); 
      new Thread(new Runnable() { 
       @Override 
       public void run() { 
        Intent start=new Intent(MainActivity.this,TimeService.class); 
        start.putExtra("StopSig",false); 
        start.putExtra("Temps_travail",mTempsTravail); //Envoi Long 
        start.putExtra("mSmallest",mSmallest); //Envoi Long 
        start.putExtra("file_src",src); //Envoi String 
        start.putExtra("file_dst",dst); //Envoi String 
        start.putExtra("Debut",sDebut); //Envoi String 
        start.putExtra("Fin",sFin); //Envoi String 
        start.putExtra("Name",sName);//Envoi String 
        start.putExtra("String_travail",sTempsTravail); //Envoi String 
        start.putExtra("Smallest",sSmallest);//Envoi String*/ 
        startService(start); 
       } 
      }).start(); 

     } 
    }); 
    mTimeListenerF.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { //Button to set the End Time 
      setFinTime(); 
      checkEnabled(); 
      new Thread(new Runnable() { 
       @Override 
       public void run() { 
        Intent end = new Intent(MainActivity.this,TimeService.class); 
        end.putExtra("StopSig",true); 
        end.putExtra("TimeF",mTimeF); 
        end.putExtra("Temps_travail",mTempsTravail); //Envoi Long 
        end.putExtra("mSmallest",mSmallest); //Envoi Long 
        end.putExtra("file_src",src); //Envoi String 
        end.putExtra("file_dst",dst); //Envoi String 
        end.putExtra("Debut",sDebut); //Envoi String 
        end.putExtra("Fin",sFin); //Envoi String 
        end.putExtra("Name",sName);//Envoi String 
        end.putExtra("String_travail",sTempsTravail); //Envoi String 
        end.putExtra("Smallest",sSmallest); 
        // startService(end); 
        stopService(end); 
       } 
      }).start(); 
     } 
    }); 
    mMail.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      sendMail(); 
     } 
    }); //Send data by mail 

は私が使うサービスは、通知を表示する方法と、次のとおりです。

public class TimeService extends Service { 
    @Override 
public void onCreate() { 
    Log.i(TAG, "Service onCreate"); 
    mContext=TimeService.this; 
} 

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 

    Log.i(TAG, "Service onStartCommand"); 
    Toast.makeText(this,"TimeServiceStarted",Toast.LENGTH_LONG).show(); 
    stopSig=intent.getBooleanExtra("StopSig",false); //Receiving Boolean 
    setDebutTime(); 
    setNotification(); 
    //Stop service once it finishes its task 
    //stopSelf(); 
    return Service.START_STICKY; 
} 

@Override 
public IBinder onBind(Intent arg0) { 
    Log.i(TAG, "Service onBind"); 
    TSTempsTravail=arg0.getLongExtra("Temps_travail",TSTempsTravail); //Receiving Long 
    TSSmallest=arg0.getLongExtra("mSmallest",TSSmallest);//Receiving Long 
    sName=arg0.getStringExtra("Name");//Receiving String 
    sDebut= arg0.getStringExtra("Debut");//Receiving String 
    sFin= arg0.getStringExtra("Fin");//Receiving String 
    sTempsTravail= arg0.getStringExtra("String_travail");//Receiving String 
    sSmallest=arg0.getStringExtra("Smallest");//Receiving String 
    return null; 
} 

@Override 
public void onDestroy() { 
    stopSig=true; 
    setFinTime(); 
    // getName(); 
    getHeureSupp(TimeD,TimeF); 
    Clock(); 
    writeToFile(sDebut,sFin,sName,sTempsTravail); 
    try { 
     copyFile(src,dst); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    //sendMail(); 
    Log.i(TAG, "Service onDestroy"); 
    //Toast.makeText(this,"Service stopped",Toast.LENGTH_LONG).show(); 
} 
     public void setNotification() { 
    Intent notificationIntent = new Intent(this, MainActivity.class); 
    /*notificationIntent.setFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT); 
    notificationIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);*/ 
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 15, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT); 
    Bitmap icon = BitmapFactory.decodeResource(getResources(), 
      R.drawable.logo); 
    NotificationCompat.Builder notification = (NotificationCompat.Builder) new NotificationCompat.Builder(this) 
      .setContentTitle("myTitle") 
      .setTicker("myTicker") 
      .setContentText("myText") 
      .setSmallIcon(R.drawable.logo_small) 
      .setLargeIcon(Bitmap.createScaledBitmap(icon, 128, 128, false)) 
      .setContentIntent(pendingIntent) 
      .setOngoing(true); 
    startForeground(15, notification.build()); 
} 

そして最後に、ここでそれが有用であることができれば、マニフェストでありますとにかく:

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="com.example.benjii.myapp"> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission> 
     <application 
    android:allowBackup="true" 
    android:icon="@drawable/logo_small" 
    android:label="@string/app_name" 
    android:roundIcon="@mipmap/ic_launcher_round" 
    android:supportsRtl="true" 
    android:theme="@style/AppTheme"> 
    <activity android:name=".MainActivity" 
       android:launchMode="singleTask"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
    <service 
     android:name=".TimeService" 
     android:icon="@drawable/logo_small" 
     android:label="@string/service"> 
    </service> 
</application> 
    </manifest> 

答えて

0

アプリケーションコンポーネント(サービス、アクティビティなど)は常にメインで実行されますどのスレッドからでも起動できます。代わりにサービスでスレッドを開始するか、IntentServiceを使用することを検討してください。