# intend Service im Android Studio



## Joob (29. Jun 2019)

Ich habe eine Desktop App in Java programmiert und wollte jetzt eine App im Android Studio schreiben.
Dazu möchte ich die Klassen verwenden die ich im Netbeans für die DesktopApp geschrieben habe.

Einige Änderungen sind natürlich notwendig, aber die Services bei der Umstellung der Services aus der DesktopApp 
komm ich nicht weiter.

Ich verwende eine Klasse in der ich die SFtp Funktionen untergebracht habe. Dabei habe ich eine innere Klassse verwendet.
Diese wollte ich durch einen Intent Service ersetzen, aber ich bekommen das nicht hin.
Kann mir jemand helfen, ich denke ich mach was grundlegendes falsch oder das ist so nicht in AndroidStudio umzusetzen.

Insbesondere geht es mir um die Zeile in der ich den Service definiere.
threadDownloadBigFromHoster = new IntentService ( this , BigDownloadService.class ) 
Hier sagt mir AS:



Ich muss ja nicht erwähnen das ich wenig Erfahrung mit AS habe, also seid bitte gnädig. Ich weiß auch das einige Bestandteile wie z.B.
isRunning in AS für den IntendService nicht funktionen, das muss noch ändern, aber ich komme an dieser Stelle gerade überhaupt 
nicht weiter.



```
public void bigDownloadFromHoster( String strLocalPathFileName, String strRemotePathFileName, ProgressBar probar, String[][] alternativAccess, Activity comeFromAct ) throws MalformedURLException, IOException   {

        /**
         * Use a Thread
         * Download a file from a FTP server, and show the progress in a Progressbar which is declared in the
         * controller who calls this method.
         * This method starts the Service [BigDownloadService] which download the sourcPath+strRemoteFileNameto the strLocalPathFileName on the local machine
         *
         * @param strLocalPathFileName               , Destination file name on LocalMachine -> "C:/Users/Jupp/TEST/test393.mp3"
         * @param strRemotePathFileName              , Source path for download from a ftpServer. -> "VOICES/"
         * @param probar                             , ProgressBar witch is in the Controller who calls this download
         * @param alternativAccess                   , for Access on other Accounts
         *
         * Sample calling
         * sftp.bigDownloadFromHoster("C:/Users/Jupp/VT/_downgeloaded.txt", "VOICES/", "downloadtest.txt", proba, null);
         *
         * @throws MalformedURLException, IOException on error.
         */

        Boolean threadruns = false;

        // vor der Threaderzeugung geprüft werden
        if (threadDownloadBigFromHoster != null) {
            threadruns = threadDownloadBigFromHoster.isRunning();
        }

        if (threadruns) {

            AlertDialog.Builder builder;
            builder = new AlertDialog.Builder(comeFromAct);
            builder.setMessage("Wait till this Service has finished !")
                    .setTitle("SFTP Class")
                    .setPositiveButton("OK", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialogInterface, int i) {

                        }
                    });

            AlertDialog dialog = builder.create();
            dialog.show();


        } else {

            connectsftp(alternativAccess);
            threadDownloadBigFromHoster = new IntentService ( this , BigDownloadService.class ) {

                @Override
                protected void onHandleIntent(Intent intent) {

                }
            };

            threadDownloadBigFromHoster.putExtra("probar", probar) ;
            threadDownloadBigFromHoster.putExtra("strLocalPathFileName", strLocalPathFileName) ;
            threadDownloadBigFromHoster.putExtra("strRemotePathFileName", strRemotePathFileName) ;
            threadDownloadBigFromHoster.putExtra("channel", channel) ;
            threadDownloadBigFromHoster.putExtra("session", session) ;




            //threadDownloadBigFromHoster = new BigDownloadService(probar, strLocalPathFileName, strRemotePathFileName, channel, session);
            //threadDownloadBigFromHoster.start();


        }
    }

    public class BigDownloadService extends IntentService {


        public BigDownloadService() {

            super("BigDownloadService");
            setIntentRedelivery(true);
        }


        public IBinder onBind(Intent intent){
            // This service is unbounded
            // So this method is never called.
            return null;
        }

        @Override
        protected void onHandleIntent(Intent intent) {

            Bundle extras = intent.getExtras();

            ProgressBar probar = (ProgressBar) extras.get("probar");
            String strRemotePathFileName = (String) extras.get("strRemotePathFileName");
            String strLocalPathFileName = (String) extras.get("strLocalPathFileName");
            ChannelSftp SftpChannel = (ChannelSftp) extras.get("SftyChannel");
            Session SftpSession = (Session) extras.get("SftpSession");

            try {

                SftpChannel.get(strRemotePathFileName, strLocalPathFileName, new ProgressMonitorClass(probar) );


                SftpChannel.disconnect();
                SftpSession.disconnect();

            } catch( SftpException ex ) {

                SftpChannel.disconnect();
                SftpSession.disconnect();

                System.err.println(ex.getMessage());
                System.out.println("File #1 not downloaded.");
                ex.printStackTrace();

            }


        }



        // Destroy
        @Override
        public void onDestroy() {


            super.onDestroy();
        }
```




Im Manifest habe ich den Service eingetragen.



```
<activity android:name=".A0001_GeneralSelector"></activity>
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

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

        <service android:name=".SYS.SFtpToolsClass$BigDownloadService"/>
        <service android:name=".SYS.SFtpToolsClass$BigUploadService"/>

    </application>
```


----------



## kneitzel (29. Jun 2019)

Die Fehlermeldung besagt, dass IntentService einen Constructor hat, der ein Strring als Argument erwartet ("IntentService(java.lang.String) in IntentService") und kann nicht mit den zwei Parametern vom Typ SFtpToolClass und Class<BigDownloadService> aufgerufen werden ("cannot be applied to (.....)").

Also ich würde hier die Klasse IntentService näher ansehen um die Klasse dann so zu nutzen, wie es angedacht ist. Die Doku der Klasse findet sich unter https://developer.android.com/reference/android/app/IntentService


----------



## Joob (29. Jun 2019)

In den Beispielen wird der intendservice immer so  gestartet.

Intent i = new Intent(this, NetworkService.class);








						Using putExtra to pass values to intent service
					

within my main activity I have the following code:  EditText usernameText; EditText passwordText; public void sendLogin (View loginview){     Intent i = new Intent(this, NetworkService.class);




					stackoverflow.com
				




in der Beschreibung wird als Parameter String angegeben.
Was meinen die damit ?


----------



## kneitzel (29. Jun 2019)

Also Intent ist eine andere Klasse als IntentService.

Das Beispiel jetzt nutzt die Klasse Intent, dein Code den Du gezeigt hast, nutzte die Klasse IntentService.

Intents sind Nachrichten zwischen Android Komponenten. Ein IntentService ist dabei ein Empfänger eines solchen Nachricht und Intent ist eine Nachricht.

Somit sollte Deine Klasse, die den Intent verarbeiten soll, IntentService erweitern, damit Du der Komponente ein Intent zuschicken kannst.

Ich würde Dir empfehlen, das alles erst einmal von Grund auf zu lesen. Es erspart später einige Zeit, wenn man sich am Anfang einmal in Ruhe anschaut, wie es bei Android abläuft.

Um auf das putExtra einzugehen: Da gibt es ganz viele Overloads um alle möglichen Daten zu speichern. Wenn Du unter https://developer.android.com/reference/android/content/Intent#public-methods mal schaust, dann siehst Du, wie viele putExtra Varianten es gibt.


----------



## Joob (29. Jun 2019)

Schönen Dank für deine Erklärung. Ich versteh das so besser !

Ich schau mir das noch mal an.
Hatte halt gedacht ich könnte die Klassen ohne großen Aufwand verwenden können,
hatte aber schon das Gefühl das das wegen der Rahmenbedingungen von Android
das nicht so klappen könnte.

Ich fass das noch mal ganz neu an.


----------

