Stworzenie aplikacji bez interfejsu

0

Witam,
czy jest możliwe napisanie aplikacji która nie będzie posiadać interfejsu tzn. po kliknięciu na ikonkę, apka się uruchomi i wykona swoje zadania jednak nie wyświetli activity ale będzie w stanie wyświetlić toast na koniec działania z informacją o pomyślnym zakończeniu swojej pracy lub w przypadku błędu ze stosownym komunikatem.

0

Jest możliwe. Spróbuj w pliku manifestu dodać do swojej aktywności:

android:theme="@android:style/Theme.Translucent.NoTitleBar"

Natomiast wykonanie zadań najlepiej zrobić w oddzielnym Service.

0

@bolson
Nie jestem pewny czy w dobre miejsce wstawiłem podany przez Ciebie kod. Ale po dodaniu go i wgraniu na telefon programu apka mi się wykrzaczy przy włączaniu
Zawartosć logcata

04-03 10:31:37.183    5426-5426/com.androidapps.androidapps.app E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: com.androidapps.androidapps.app, PID: 5426
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.androidapps.androidapps.app/com.androidapps.androidapps.app.MainActivity}: java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2198)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2248)
            at android.app.ActivityThread.access$800(ActivityThread.java:138)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1199)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:136)
            at android.app.ActivityThread.main(ActivityThread.java:5050)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
            at dalvik.system.NativeStart.main(Native Method)
     Caused by: java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.
            at android.support.v7.app.ActionBarActivityDelegate.onCreate(ActionBarActivityDelegate.java:111)
            at android.support.v7.app.ActionBarActivityDelegateICS.onCreate(ActionBarActivityDelegateICS.java:58)
            at android.support.v7.app.ActionBarActivity.onCreate(ActionBarActivity.java:98)
            at com.androidapps.androidapps.app.MainActivity.onCreate(MainActivity.java:26)
            at android.app.Activity.performCreate(Activity.java:5241)
            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2162)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2248)
            at android.app.ActivityThread.access$800(ActivityThread.java:138)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1199)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:136)
            at android.app.ActivityThread.main(ActivityThread.java:5050)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
            at dalvik.system.NativeStart.main(Native Method)

wpis z logcata at com.androidapps.androidapps.app.MainActivity.onCreate(MainActivity.java:26) wskazuje na linijkę z super.onCreate(savedInstanceState);
Próbowałem, ją za komentować ale to też nie jest dobre wyjście bo też się wykrzacza apka przy uruchamiania ale wtedy wywala:

04-03 10:28:45.753    4736-4736/com.androidapps.androidapps.app E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: com.androidapps.androidapps.app, PID: 4736
    android.util.SuperNotCalledException: Activity {com.androidapps.androidapps.app/com.androidapps.androidapps.app.MainActivity} did not call through to super.onCreate()
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2164)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2248)
            at android.app.ActivityThread.access$800(ActivityThread.java:138)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1199)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:136)
            at android.app.ActivityThread.main(ActivityThread.java:5050)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
            at dalvik.system.NativeStart.main(Native Method)
0

Czy twoja aktywność dziedziczy po ActionBarActivity? Jeśli tak to zmień na Activity.

0

@bolson
Teraz niby działa ale po zamknięciu aplikacja znów się uruchamia i nie pokazuje toastów

Kod Activity:

public class MainActivity extends ActionBarActivity {
    private ControlSystemBT controlSystem;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        //super.onCreate(savedInstanceState);
        //setContentView(R.layout.activity_main);

       

        
           sendBT();
           takeBT();

                controlSystem.close();
                System.exit(0);

    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {

        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
    // METODA TWORZĄCA TOASTY
    private void makeToast(String s) {
        Toast t = Toast.makeText(this, s, Toast.LENGTH_LONG);
        t.show();
    }
     public void sendBT(){
       controlSystem = new ControlSystem(getApplicationContext());
       controlSystem.sendParControl();

               
   }
0
//super.onCreate(savedInstanceState);

Odkomentuj to, zamknij aktywność za pomocą finish() nie System.exit(0).

Jak pisałem wyżej, oddeleguj wykonywanie zadań do Service. Tworząc Toast nie powinieneś przekazywać aktywności jako kontektstu, ponieważ ona już nie będzie istnieć.

0

@bolson
Zrobiłem jak mówiłes. Tylko nie jestem pewny czy właściwie to robię.

Dodałem w onCreate funkcje start() i sugerowaną przez ciebie finish()

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        start();
        finish();
    }
public void start(){
    startService(new Intent(getBaseContext(),XririService.class));
}

oraz dodałem wpis w manifescie

<service android:name=".XririService" />

i stworzyłem klasę XririService:

public class XririService extends IntentService {
private ControlSystemBT controlSystem;

public XririService() {
        super("XririService");
    }

    @Override
    protected void onHandleIntent(Intent intent) {


           sendBT();
           takeBT();
 
           controlSystem.close();
}

// METODA TWORZĄCA TOASTY
    private void makeToast(String s) {
        Toast t = Toast.makeText(this, s, Toast.LENGTH_LONG);
        t.show();
    }
     public void sendBT(){
       controlSystem = new ControlSystem(getApplicationContext());
       controlSystem.sendParControl();

Teraz wszytko wydaje się działać. Tylko nie wiem co powinienem przekazać toastowi jako kontekst żeby się wyświetlały te toasty?

0

IntentService działa w tle, natomiast Toast musisz uruchomić w wątku UI. Spróbuj tak:

public class XririService extends IntentService {
    private ControlSystemBT controlSystem;
    private Handler handler;

    public XririService() {
        super("XririService");
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        sendBT();
        takeBT();
        controlSystem.close();

        handler.post(new Runnable() {
            @Override
            public void run() {
                makeToast(ControlSystemBT.this, "Zakończyłem działanie!");
            }
        });
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        handler = new Handler();
        return super.onStartCommand(intent, flags, startId);
    }

    // METODA TWORZĄCA TOASTY
    private void makeToast(Context context, String s) {
        Toast t = Toast.makeText(context, s, Toast.LENGTH_LONG);
        t.show();
    }

    public void sendBT() {
        controlSystem = new ControlSystem(getApplicationContext());
        controlSystem.sendParControl();
    }
}
0

@bolson
Niestety tak to nie będzie działać bo klasa ControlSystemBT nie posiada interfejsu a wczesniej w konstruktorze przekazywałem jej Context z ActivityMain (żeby móc wyświetlać komunikaty z tej klasy) a teraz nie wiem skąd wziąć ten context by móc te toasty wyświetlać.

Jak wpisałem to co sugerowałes to mi pokazuje błąd:
Error:(53, 48) error: not an enclosing class: ControlSystemBT

1

Sorry mój błąd :) za mało kawy dziś. Powinieneś przekazać referencję do obiektu klasy serwisu.

   handler.post(new Runnable() {
            @Override
            public void run() {
                makeToast(XiriService.this, "Zakończyłem działanie!");
            }
        });
0

Wielkie dzięki teraz działa.

1 użytkowników online, w tym zalogowanych: 0, gości: 1