androidserviceandroid-servicejava-threadsandroid-thread

I want to show gif image show on screen even when app is closed


With a mouse click, you implement two things:

I'm trying to show the GIF on the screen even when I close the app I'm using the services but because the sound keeps playing while the GIF image appears, I can not find the solution.

TheService.java (CODE)

package gallery.suitapps.catwalking;

import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.media.MediaPlayer;
import android.media.SoundPool;
import android.os.Build;
import android.os.IBinder;
import android.provider.Settings;
import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ImageView;
import android.widget.Toast;

import pl.droidsonroids.gif.GifImageView;

public class TheService extends Service  {

    final class MyThreadClass implements Runnable{
        int service_id;
        MyThreadClass(int service_id){
            this.service_id=service_id;
        }

        @Override
        public void run() {

        }
    }

    SoundPool soundPool = null;
    private int[] f10685s;


    MainActivity main = new MainActivity();

    public MediaPlayer player;
    Context context;

    @Override
    public void onCreate() {
        super.onCreate();
    }

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

        Toast.makeText(this,"Service Starts" , Toast.LENGTH_SHORT).show();
        player = MediaPlayer.create(this,R.raw.sound2);
        player.setLooping(true);
        player.start();

        MainActivity.imageView.setImageResource(R.drawable.cat_gif);

        return START_STICKY;

    }

    @Override
    public void onDestroy() {
        Toast.makeText(this,"Service Stops" , Toast.LENGTH_SHORT).show();
        player.stop();
        MainActivity.imageView.setImageResource(R.drawable.ic_launcher_background);
    }

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

}

MainActivity.java (CODE)

package gallery.suitapps.catwalking;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;

import pl.droidsonroids.gif.GifImageView;

public class MainActivity extends AppCompatActivity {

    public static GifImageView imageView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        imageView = findViewById(R.id.catgif);
    }

    public void startService (View view){

        Intent intent = new Intent(this,TheService.class);
        startService(intent);

       // imageView.setImageResource(R.drawable.cat_gif);

    }

    public void stopService (View view){

        Intent intent = new Intent(this,TheService.class);
        stopService(intent);

    }


}

activity_main.xml

 <?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/startService"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="8dp"
        android:layout_marginEnd="8dp"
        android:layout_marginLeft="8dp"
        android:layout_marginRight="8dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:text="Start Service"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.501"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.134"
        android:onClick="startService"/>

    <Button
        android:id="@+id/stopService"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="8dp"
        android:layout_marginEnd="8dp"
        android:layout_marginLeft="8dp"
        android:layout_marginRight="8dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:text="Stop Service"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.502"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.362"
        android:onClick="stopService"/>

    <pl.droidsonroids.gif.GifImageView
        android:id="@+id/catgif"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:src="@drawable/ic_launcher_background"
        android:background="@android:color/holo_blue_dark"
        />

</android.support.constraint.ConstraintLayout>

Solution

  • According to your requirement you need to implement system window alert in service class to show image in background when the app is closed

    This is the solution for your requirement.

    In manifest add this

     <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
    

    Then in your launcher activity or any base activity add these permissions

     private static final int CODE_DRAW_OVER_OTHER_APP_PERMISSION = 2084;
    

    In onCreate() add this

    if (SDK_INT >= Build.VERSION_CODES.M && !Settings.canDrawOverlays(this)) {
                Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + getPackageName()));
                startActivityForResult(intent, CODE_DRAW_OVER_OTHER_APP_PERMISSION);
                //finish();
            }
    

    Handle the request permission

    @Override
        public void onActivityResult(int requestCode, int resultCode, Intent data) {
            if (requestCode == CODE_DRAW_OVER_OTHER_APP_PERMISSION) {
                if (SDK_INT >= Build.VERSION_CODES.M && !Settings.canDrawOverlays(this)) {
                    Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + getPackageName()));
                    startActivityForResult(intent, CODE_DRAW_OVER_OTHER_APP_PERMISSION);
                } else {
                   // do stuff here 
                }
            }
        }
    

    and do this in service class check the link below and do your stuff respectively

       https://medium.com/@kevalpatel2106/create-chat-heads-like-facebook-messenger-32f7f1a62064
    

    where image_layout. xml is

    <?xml version="1.0" encoding="utf-8"?>
    <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">
    
        <pl.droidsonroids.gif.GifImageView
            android:id="@+id/catgif"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:src="@drawable/ic_launcher_background"
            android:background="@android:color/holo_blue_dark"
            />
    
    </android.support.constraint.ConstraintLayout>
    

    Update:- You can make changed in image_layout file to show your GIF any size and gravity in the screen You can make changes with

    android:layout_width="any_size"
        android:layout_height="any_size"