TheName
TheName

Reputation: 33

Broadcast receiver - send String between apps

I am trying to send string from app to app.

First app called "send" has only "MainActivity" class and layout:

private void sendMsg(){

    final TextView msg = (TextView) findViewById(R.id.sendText);
    Button snd = (Button)findViewById(R.id.sendButton);

            snd.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if(!msg.getText().toString().trim().equals("")){
                Intent intent = new Intent("Updated");
                intent.setAction(Intent.ACTION_SEND);
                intent.putExtra("TEXT", msg.getText().toString().trim());
                intent.setType("text/plain");
                intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
                intent.setComponent(new ComponentName("com.example.rec","com.example.rec.broadcastReciver"));
                getApplicationContext().sendBroadcast(intent);
            }else{
                Toast.makeText(getApplicationContext(), "Write text that You want to broadcast!", Toast.LENGTH_LONG).show();
            }
        }
    });
}

Second app called "rec" has two classes "broadcastReciver" and "MainActivity".

MainActivity:

public class MainActivity extends AppCompatActivity {

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

    private void zoviBroadCast(){
        broadcastReciver brcv = new broadcastReciver();
        registerReceiver(brcv,
                new IntentFilter("action"));
    }
}

broadcastReciver:

public class broadcastReciver extends BroadcastReceiver {
    public void onReceive(Context context, Intent intent)
    {
        //String data = intent.getStringExtra("TEXT").trim();
        if (intent != null)
        {
            String sIntentAction = intent.getAction();
            if (sIntentAction != null && sIntentAction.equals("action"))
            {
                String data = intent.getStringExtra("TEXT").trim();
                Toast.makeText(context, data, Toast.LENGTH_LONG).show();
            }
            else {
                Toast.makeText(context,"Something went wrong",Toast.LENGTH_SHORT).show();
            }
        }

    }
}

I also added lines between tag "receiver" in "AndroidManifest.xml":

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.rec">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <receiver
            android:name=".broadcastReciver"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="action" />
            </intent-filter>
        </receiver>
    </application>
</manifest>

What application should do is when I type something in first application and send it another over button it should "broadcast" (show) toast at second app.

My second application is not showing any data when run.

Upvotes: 1

Views: 847

Answers (1)

Steyrix
Steyrix

Reputation: 3226

Nowadays it is essential to specify an action in intent filter of your broadcast receiver.

<receiver android:name="MyReceiver" >
        <intent-filter>
            <action android:name="android.intent.action.MY_ACTION">          
            </action>
        </intent-filter>
    </receiver>

When sending the broadcast, you need to set exactly the same action to the intent you send.

Intent i = new Intent();
i.setAction("android.intent.action.MY_ACTION");
context.sendBroadcast(i);

Notation of action name may be not very important to get your code working, but I recommend to give names related to the package of your sending app. For example: "com.username.example.myApplication.ACTION_EXAMPLE"

Upvotes: 2

Related Questions